我正在使用< 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)'!=''" />
非常感谢任何进一步的帮助。这对我来说有点棘手。
感谢您的任何提示。
艾伦
答案 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)