我有一个msbuild脚本执行一些复制操作。它实际上完成了一整堆副本和其他事情,包括消息,删除,删除,自己的ItemGroup部分等。
我需要复制这个目标,但只有1%的XML是不同的。目前,它只是增加了1个额外的任务。我不想复制&粘贴整个目标,我宁愿设置一个共同的目标来执行两者共有的任务,并将专门的添加物放在一个单独的目标中。或多或少我只是希望msbuild能够将行为中的XML内容复制/粘贴到每个部分中。
以下是一个例子:
<Target Name="Copy Stuff">
<Copy SourceFiles="@(FILES_STUFF1)" DestinationFolder="$(BASE_DIR)\stuff1"/>
<Copy SourceFiles="@(FILES_STUFF2)" DestinationFolder="$(BASE_DIR)\stuff2"/>
<Copy SourceFiles="@(FILES_STUFF3)" DestinationFolder="$(BASE_DIR)\stuff3"/>
</Target>
然后我需要创建第二个目标,只增加1个Copy
:
<Target Name="Copy Stuff More">
<Copy SourceFiles="@(FILES_STUFF1)" DestinationFolder="$(BASE_DIR)\stuff1"/>
<Copy SourceFiles="@(FILES_STUFF2)" DestinationFolder="$(BASE_DIR)\stuff2"/>
<Copy SourceFiles="@(FILES_STUFF3)" DestinationFolder="$(BASE_DIR)\stuff3"/>
<Copy SourceFiles="@(FILES_STUFF4)" DestinationFolder="$(BASE_DIR)\stuff4"/>
</Target>
如何集中复制的XML片段?我读了一些关于msbuild批处理的内容,但它对我来说绝对是零。我不相信它会解决我的问题。我见过的所有这些例子都是针对Message日志的,但我做的远不止这些。
答案 0 :(得分:1)
创建目标文件并使用Import
在项目文件中导入目标。
您的目标文件是这样的:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MyTargetDependsOn>
</MyTargetDependsOn>
</PropertyGroup>
<Target Name="MyTarget" Condition="$(MyTargetCondition)" DependsOnTargets="$(MyTargetDependsOn)">
<Copy SourceFiles="@(FILES_STUFF1)" DestinationFolder="$(BASE_DIR)\stuff1"/>
<Copy SourceFiles="@(FILES_STUFF2)" DestinationFolder="$(BASE_DIR)\stuff2"/>
<Copy SourceFiles="@(FILES_STUFF3)" DestinationFolder="$(BASE_DIR)\stuff3"/>
</Target>
</Project>
您的项目文件或辅助目标文件是这样的:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="MyTarget.targets"/>
<PropertyGroup>
<MyTargetDependsOn>
$(MyTargetDependsOn);
MyTargetHook
</MyTargetDependsOn>
</PropertyGroup>
<Target Name="MyTargetHook">
<Copy SourceFiles="@(FILES_STUFF4)" DestinationFolder="$(BASE_DIR)\stuff4"/>
</Target>
</Project>
答案 1 :(得分:1)
你真的不需要在这里进行任何批处理,而是可以让一个目标依赖另一个目标,参见Target documentation。这将在实际目标之前调用依赖目标:
<Target Name="Copy Stuff">
<Copy SourceFiles="@(FILES_STUFF1)" DestinationFolder="$(BASE_DIR)\stuff1"/>
<Copy SourceFiles="@(FILES_STUFF2)" DestinationFolder="$(BASE_DIR)\stuff2"/>
<Copy SourceFiles="@(FILES_STUFF3)" DestinationFolder="$(BASE_DIR)\stuff3"/>
</Target>
<Target Name="Copy Stuff More" DependsOnTargets="Copy Stuff">
<Copy SourceFiles="@(FILES_STUFF4)" DestinationFolder="$(BASE_DIR)\stuff4"/>
</Target>