MSBuild条件Exec?

时间:2010-10-18 18:01:37

标签: post msbuild build conditional

我正在使用< MSBuild Projects =“...标记构建各种项目。然后我在项目构建后执行一些命令行工具。

E.g

<Target Name="Name">
    <MSBuild Projects="" />
    <Exec Command="" />
</Target>

我注意到项目只是根据需要构建,并在运行构建脚本时获得以下输出:“跳过目标”CoreCompile“因为所有输出文件都是最新的”。这很棒但是如何让我的&lt; Exec ...命令使用相同的条件,以便它们只在必要时运行?

更新:我已经实现了gregmac的建议,但无论如何它仍在执行命令。这就是我现在所拥有的:

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

非常感谢任何进一步的帮助。这对我来说有点棘手。

感谢您的任何提示。

艾伦

3 个答案:

答案 0 :(得分:2)

您应该可以使用TargetOutputs parameter

<MSBuild Projects="" >
   <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug -->
<Exec Command="" Condition="'@(AssembliesBuiltByChildProjects)'!=''" />

答案 1 :(得分:1)

如果您可以为每个项目添加以下内容:

<Target Name="DoStuffWithNewlyCompiledAssembly">
    <Exec Command="" />
</Target>

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

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

这是有效的,因为有人聪明的微软在CoreCompile Microsoft.[CSharp|VisualBasic][.Core].targets目标末尾添加了以下行(文件名取决于语言和MSBuild / Visual Studio版本)。

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

因此,如果您在TargetsTriggeredByCompilation属性中指定目标名称,则目标将在CoreCompile运行时运行 - 如果跳过CoreCompile,您的目标将无法运行(例如,因为输出程序集已经与代码相关了。)

答案 2 :(得分:0)

我确实设法找到符合我需求的解决方案,尽管它可能不是最佳解决方案。

请在此处查看我对其他问题的回答:MSBuild Post-Build

谢谢, 艾伦