我正在使用MSBuild
运行一些管理脚本,因此这里不涉及编译器或链接器,我注意到构建系统跳过了在目标中成功运行的目标。
我如何每次强制运行目标?
样品:
<Project ToolsVersion="4.0" DefaultTargets="Foo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Foo" >
<CallTarget Targets="Bar" />
<CallTarget Targets="Bar" />
</Target>
<Target Name="Bar" >
<Message Text="Bar" />
</Target>
</Project>
调用
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe msbuild.xml /v:d
结果
Bar:
Bar
所以它不会被调用两次,/ v:d表示已跳过第二次调用,但不清楚如何在不创建目标Bar1
和Bar2
有没有办法在Bar
中执行两次目标Foo
?
搜索的内容围绕cl.exe,xcopy等检测到没有变化,但这只是MSBuild
答案 0 :(得分:3)
Tagets只在构建中被调用一次,除非发生了一些变化,所以如果你想多次调用同一个目标,你必须通过改变属性来欺骗MsBuild。这可以这样做:
<Target Name="Foo" >
<MSBuild Projects="$(MsBuildThisFile)" Targets="Bar" Properties="Dummy=1" />
<MSBuild Projects="$(MsBuildThisFile)" Targets="Bar" Properties="Dummy=2" />
</Target>
<Target Name="Bar" >
<Message Text="Bar" />
</Target>
然而,作为&#39;诀窍&#39;表示:几乎总会有更多的MsBuild&#39;这样做的方式(通常在ItemGroup上进行批处理),所以如果你让你的问题更具规范性,那么也可能有更好的答案。