MSBuild条件执行?

4
我正在使用<MSBuild Projects="...的标记构建各种项目。然后在项目构建完成后,我会执行一些命令行工具。
例如:
<Target Name="Name">
    <MSBuild Projects="" />
    <Exec Command="" />
</Target>

我注意到该项目只按需构建,并在运行构建脚本时得到以下输出:“由于所有输出文件都是最新的,因此跳过目标“CoreCompile”。”这很好,但我如何使我的<Exec...命令使用相同的条件,以便它们也仅在必要时运行? 更新:我已经实施了gregmac的建议,但它仍然会执行命令。现在我有以下内容:
<Target Name="Name">
<MSBuild Projects="">
    <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
<Exec Command="" Condition="'@(AssembliesBuiltByChildProjects)'!=''" />

任何进一步的帮助都将不胜感激。这对我来说是一个难点。
感谢任何建议。
艾伦
4个回答

2
你应该能够使用 TargetOutputs 参数
<MSBuild Projects="" >
   <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug -->
<Exec Command="" Condition="'@(AssembliesBuiltByChildProjects)'!=''" />

嗨,感谢您的建议,很抱歉没有及时回复。我现在才开始尝试。我已经尝试过了,但无论项目是否构建,它仍然执行命令。请参见我的更新问题。有什么想法吗? - Alan Spark
经过进一步调查,我发现AssembliesBuiltByChildProjects确实包含了我的程序集名称。但是,无论项目是否构建,这个值都没有区别... 这有点令人沮丧,因为它离成功这么近了。有人能帮忙解决吗? - Alan Spark

1
如果您能在每个项目中添加以下内容:
<Target Name="DoStuffWithNewlyCompiledAssembly">
    <Exec Command="" />
</Target>

...那么你只需要添加一个属性:

<Target Name="Name">
  <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" />
</Target>

这是因为微软的某位聪明人在Microsoft.[CSharp|VisualBasic][.Core].targets中的CoreCompile目标的末尾添加了以下行(文件名取决于语言和MSBuild/Visual Studio版本)。
<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

如果在TargetsTriggeredByCompilation属性中指定了目标名称,那么当CoreCompile运行时,您的目标将运行--如果CoreCompile被跳过(例如因为输出程序集已经与代码相关联并且是最新的),则您的目标不会运行。

0

你问错了问题。

Exec 没有任何条件,但是你可以在目标元素上设置条件,像这样使用。

<Target Name="Name" Condition="@(AssembliesBuiltByChildProjects)'!=''">
    <MSBuild Projects="">
        <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
    </MSBuild>
    <Exec Command=""/>
  </Target>

<Target Name="Name" Condition="@(AssembliesBuiltByChildProjects)'==''">
    ...
</Target>

-1

我成功地找到了一个解决方案来满足我的需求,尽管它可能不是最优解。

请查看我在这里提出的另一个问题的答案:MSBuild Post-Build

谢谢, Alan


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接