如何使用msbuild项目文件本身内的不同参数两次调用相同的msbuild目标

mar*_*ark 16 msbuild msbuild-task

我有以下msbuild代码:

  <PropertyGroup>
    <DirA>C:\DirA\</DirA>
    <DirB>C:\DirB\</DirB>
  </PropertyGroup>

  <Target Name="CopyToDirA"
          Condition="Exists('$(DirA)') AND '@(FilesToCopy)' != ''"
          Inputs="@(FilesToCopy)"
          Outputs="@(FilesToCopy -> '$(DirA)%(Filename)%(Extension)')">
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DirA)" />
  </Target>

  <Target Name="CopyToDirB"
          Condition="Exists('$(DirB)') AND '@(FilesToCopy)' != ''"
          Inputs="@(FilesToCopy)"
          Outputs="@(FilesToCopy -> '$(DirB)%(Filename)%(Extension)')">
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DirB)" />
  </Target>

  <Target Name="CopyFiles" DependsOnTargets="CopyToDirA;CopyToDirB"/>
Run Code Online (Sandbox Code Playgroud)

因此,调用目标CopyFiles会将相关文件复制到,$(DirA)并且$(DirB)只要它们尚未存在并且是最新的.

但目标CopyToDirACopyToDirB看起来相同,除了一个副本$(DirA)和另一个 - 到$(DirB).是否有可能将它们统一到一个首先调用的目标中$(DirA)然后用$(DirB)

谢谢.

Rub*_*ink 14

您应该能够生成包含Dirs的ItemGroup,然后生成%.

<ItemGroup>
    <Dirs Include="C:\DirA\;C:\DirB\">
</ItemGroup>
<Target Name="CopyFiles"
    Condition="Exists('%(Dirs)') AND '@(FilesToCopy)' != ''"
    Inputs="@(FilesToCopy)"
    Outputs="@(FilesToCopy -> '%(Dirs)%(Filename)%(Extension)')">
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="%(Dirs)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

或者您可以进行2次显式调用:

<Target Name="CopyFiles">
    <MsBuild Projects="$(MSBuildProjectFullPath)" Targets="CopyASetOfFiles" Properties="FilesToCopy=@(FilesToCopy);DestDir=$(DirA)" />
    <MsBuild Projects="$(MSBuildProjectFullPath)" Targets="CopyASetOfFiles" Properties="FilesToCopy=@(FilesToCopy);DestDir=$(DirB)" />
</Target>

<Target Name="CopyASetOfFiles"
    Condition="Exists('$(DestDir)') AND '@(FilesToCopy)' != ''"
    Inputs="@(FilesToCopy)"
    Outputs="@(FilesToCopy -> '$(DestDir)%(Filename)%(Extension)')">
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DestDir)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

我没有测试过任何一种语法,但对第二种语法相对更有信心.

(答案,如果有的话,就在我桌上的Sayed Hashimi书中 - 你必须等到第一个:

  1. 拿到这本书
  2. 我觉得无聊
  3. 赛义德发现这篇​​文章并提出了一个精彩的测试答案)