使用具有特定约束的MSBuild复制每个构建的链接内容文件

时间:2017-06-09 11:48:05

标签: c# vb.net msbuild

我正在使用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>   

它不工作。没有文件被复制。请提出任何想法。

1 个答案:

答案 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