如何在MSBuild目标中共享任务/操作?

时间:2016-10-03 18:08:52

标签: xml msbuild

我有一个msbuild脚本执行一些复制操作。它实际上完成了一整堆副本和其他事情,包括消息,删除,删除,自己的ItemGroup部分等。

我需要复制这个目标,但只有1%的XML是不同的。目前,它只是增加了1个额外的任务。我不想复制&粘贴整个目标,我宁愿设置一个共同的目标来执行两者共有的任务,并将专门的添加物放在一个单独的目标中。或多或少我只是希望m​​sbuild能够将行为中的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日志的,但我做的远不止这些。

2 个答案:

答案 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>
相关问题