调用子目标两次会导致该目标被跳过。如何预防?

3

我正在使用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的情况下实现对目标BarFoo中执行两次?

寻找这个问题的解决方案围绕着cl.exe、xcopy等工具来检测是否有更改,但这只适用于MSBuild


1
好的,我刚刚发现这是一个重复的问题:如何两次调用相同的msbuild目标? - stijn
1个回答

4

在构建过程中,目标只会被调用一次,除非有变化发生。因此,如果您想多次调用相同的目标,则需要通过更改属性来欺骗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>

然而,正如“技巧”所示:几乎总有更多的“MsBuild”方法来做到这一点(通常是批处理ItemGroup),因此,如果您使您的问题更具体,可能会有更好的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接