MSBuild条件Exec?

问题描述 投票:2回答:3

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

E.g

<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)'!=''" />

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

谢谢你的任何提示。

post msbuild build conditional
3个回答
2
投票

你应该能够使用TargetOutputs parameter

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

1
投票

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

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

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

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

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

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

因此,如果您在TargetsTriggeredByCompilation属性中指定目标名称,那么如果CoreCompile运行,您的目标将会运行 - 如果跳过CoreCompile,您的目标将无法运行(例如,因为输出程序集已经相对于代码是最新的) 。


0
投票

虽然它可能不是最佳解决方案,但我设法找到了满足我需求的解决方案。

在这里查看我对其他问题的回答:MSBuild Post-Build

谢谢,艾伦

© www.soinside.com 2019 - 2024. All rights reserved.