我有下面这段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"/>
调用目标CopyFiles
将相关文件复制到$(DirA)
和$(DirB)
,前提是它们不存在或不是最新的。
但是CopyToDirA
和CopyToDirB
目标看起来完全相同,除了一个将文件复制到$(DirA)
,另一个则是复制到$(DirB)
。是否可能将它们统一到一个目标中,首先使用$(DirA)
调用,然后使用$(DirB)
调用?
谢谢。
$(MSBuildProjectFile)
替换为$(MSBuildProjectFullPath)
,以使复制文件目标清晰明确是为了另一个MSBuild分叉调用正下方的Target
(除非有InitialTargets
在播放中),因此将运行的唯一目标是CopyASetOfFiles
,它仅需要传递的两个属性(即FilesToCopy
和DestDir
)。关于擦亮我的答案而言,最重要的事情是BuildInParallel="true"
和Dirs
上的%
批处理操作,以使它们可以并行化。希望您同意我的推理,并且我没有漏掉任何东西! - Ruben Bartelink