两次调用子目标会导致跳过此目标。怎么预防?

时间:2014-08-17 08:33:39

标签: msbuild

我正在使用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表示已跳过第二次调用,但不清楚如何在不创建目标Bar1Bar2

的情况下避免这种情况

有没有办法在Bar中执行两次目标Foo

搜索的内容围绕cl.exe,xcopy等检测到没有变化,但这只是MSBuild

1 个答案:

答案 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上进行批处理),所以如果你让你的问题更具规范性,那么也可能有更好的答案。