我正在使用Visual Studio的链接文件概念共享文件。所以我需要使用MSBuild在每个构建中复制链接的内容文件。
为此,我已在Project标签内的.vbproj文件中编写此代码。
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
<Copy SourceFiles="%(Content.Identity)" DestinationFiles=(Content.Identity)"
SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true"
Condition="'@(AllFiles)' != ''" />
</Target>
它工作正常。正在复制所有链接的文件。
但在这里我需要添加某些约束,例如'不要用.vb复制文件 扩展名“。如何实现?
我试过这段代码
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
<CreateItem Include="%(Content.Identity)">
<Output ItemName="AllFiles" TaskParameter="Include" />
</CreateItem>
<ItemGroup>
<AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.vb'"/>
</ItemGroup>
<Copy SourceFiles="@(AllFiles)" DestinationFiles="@(AllFiles)"
SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true"
Condition="'@(AllFiles)' != ''" />
</Target>
它不工作。没有文件被复制。请提出任何想法。
答案 0 :(得分:0)
删除项目的方式应该有效。但是复制任务的SourceFiles和DestinationFiles在您显示的代码中是相同的,因此显然是一个空操作。请改用这样的东西:
<Copy SourceFiles="@(AllFiles)" DestinationFolder="$(MyDestDir)" />
或者,如果目标文件名取决于输入文件名:
<Target Name="MyCopy">
<ItemGroup>
<AllFiles Include="%(Content.Identity)" Condition="'%(Extension)' != '.vb'">
<!-- Add metadata which will be used as destination directory:
strip point from extension and convert to uppercase -->
<Ext>$([System.String]::Copy('%(Extension)').Replace('.','').ToUpper())</Ext>
</AllFiles>
</ItemGroup>
<Copy SourceFiles="@(AllFiles)"
DestinationFiles="@(AllFiles->'$(OutDir)\%(Ext)\%(Filename)%(Extension)')" />
</Target>
您不需要检查AllFiles是否为空:如果是,则不会复制任何内容。
正如您所看到的,我使用了一种更简单,更简单的方法来实现对项目的过滤:使用Remove,您总是需要两个语句,只需使用扩展条件就可以了。为了完整起见,这里有4种不同的方式,包括你的,但第一种方法是最短的(也注意你不需要CreateItem,只需使用一个项目:更少的输入,相同的效果):
<ItemGroup>
<Content Include="a.foo;b.foo;a.vb;b.vb"/> <!-- sample items -->
</ItemGroup>
<Target Name="FilterExamples">
<ItemGroup>
<AllFilesUsingCondition Include="%(Content.Identity)" Condition="'%(Extension)' != '.vb'"/>
<VbFiles Include="%(Content.Identity)" Condition="'%(Extension)' == '.vb'"/>
<AllFilesUsingExclude Include="%(Content.Identity)" Exclude="@(VbFiles)"/>
<AllFilesUsingRemove Include="%(Content.Identity)"/>
<AllFilesUsingRemove Remove="@(VbFiles)"/>
<AllFilesUsingRemoveCondition Include="%(Content.Identity)"/>
<AllFilesUsingRemoveCondition Remove="@(AllFilesUsingRemoveCondition)" Condition="'%(Extension)' == '.vb'"/>
</ItemGroup>
<Message Text="AllFilesUsingCondition=@(AllFilesUsingCondition)" />
<Message Text="AllFilesUsingExclude=@(AllFilesUsingExclude)" />
<Message Text="AllFilesUsingRemove=@(AllFilesUsingRemove)" />
<Message Text="AllFilesUsingRemoveCondition=@(AllFilesUsingRemoveCondition)" />
</Target>
输出:
AllFilesUsingCondition=a.foo;b.foo
AllFilesUsingExclude=a.foo;b.foo
AllFilesUsingRemove=a.foo;b.foo
AllFilesUsingRemoveCondition=a.foo;b.foo