我正在尝试使用MSBuild从文本文件中读取文件列表,然后执行递归复制,将那些目录文件的内容复制到某些暂存区域,同时排除某些扩展名(例如.tmp文件)
我已经成功地使用CreateItem和MSBuild复制任务轻松完成了上述大部分操作,无论我做什么,CreateItem任务都只是忽略了我的Exclude参数:
<PropertyGroup>
<RootFolder>c:\temp</RootFolder>
<ExcludeFilter>*.tmp</ExcludeFilter>
<StagingDirectory>staging</StagingDirectory>
</PropertyGroup>
<ItemGroup>
<InputFile Include="MyFile.txt" />
</ItemGroup>
<Target Name="Build">
<ReadLinesFromFile File="@(InputFile)">
<Output ItemName="AllFolders" TaskParameter="Lines" />
</ReadLinesFromFile>
<CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**"
Exclude="$(ExcludeFilter)">
<Output ItemName="AllFiles" TaskParameter="Include" />
</CreateItem>
<Copy SourceFiles="@(AllFiles)"
DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"
“ MyFile.txt”的示例内容:
somedirectory\
someotherdirectory\
(即,路径是相对于
$(RootFolder)
的-请提及这一点,因为我在某处读到它可能是相关的)我曾尝试加载各种不同的Exclude过滤器组合,但是我似乎永远无法获得它来正确排除我的.tmp文件-是否有任何方法可以通过MSBuild做到这一点而不求助于xcopy?
最佳答案
您必须在绝对路径中指定Exclude
并更改排除通配符以包含子目录
如果为Include
使用绝对路径,则必须为Exclude
使用绝对路径。如果对Include
使用相对路径,则必须对两者都使用相对路径。
<PropertyGroup>
<RootFolder>c:\temp</RootFolder>
<ExcludeFilter>**\*.tmp</ExcludeFilter>
<StagingDirectory>staging</StagingDirectory>
</PropertyGroup>
<ItemGroup>
<InputFile Include="MyFile.txt" />
</ItemGroup>
<Target Name="Build">
<ReadLinesFromFile File="@(InputFile)">
<Output ItemName="AllFolders" TaskParameter="Lines" />
</ReadLinesFromFile>
<CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**"
Exclude="$(RootFolder)\%(AllFolders.RelativeDir)$(ExcludeFilter)">
<Output ItemName="AllFiles" TaskParameter="Include" />
</CreateItem>
<Copy SourceFiles="@(AllFiles)"
DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>
多个排除和绝对路径
如果要排除多个项目,则在使用绝对路径时没有一种干净的方法,但是可以使用
Remove
进行。第一种方式:使用删除和项目
<PropertyGroup>
<RootFolder>c:\temp</RootFolder>
</PropertyGroup>
<ItemGroup>
<InputFile Include="MyFile.txt" />
<!-- Exclude are defined here -->
<ExcludeFilters Include="$(RootFolder)\**\*.tmp"/>
<ExcludeFilters Include="$(RootFolder)\**\*.bmp"/>
</ItemGroup>
<Target Name="Build">
<ReadLinesFromFile File="@(InputFile)">
<Output ItemName="AllFolders" TaskParameter="Lines" />
</ReadLinesFromFile>
<CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**">
<Output ItemName="AllFiles" TaskParameter="Include" />
</CreateItem>
<!-- Removing the wrong extension in item -->
<ItemGroup>
<AllFiles Remove="@(ExcludeFilters)"/>
</ItemGroup>
<Copy SourceFiles="@(AllFiles)"
DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>
第二种方式:使用Remove和Condition
<Target Name="Build">
<ReadLinesFromFile File="@(InputFile)">
<Output ItemName="AllFolders" TaskParameter="Lines" />
</ReadLinesFromFile>
<CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**">
<Output ItemName="AllFiles" TaskParameter="Include" />
</CreateItem>
<!-- Removing the wrong extension in item -->
<ItemGroup>
<AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.tmp'"/>
<AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.bmp'"/>
</ItemGroup>
<Copy SourceFiles="@(AllFiles)"
DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>
关于msbuild - 尝试排除某些扩展以执行递归副本(MSBuild),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3031021/