在MSBuild中设置属性值

3

让我们考虑下面的例子。

在这个例子中,我有:

  1. 目标MAIN调用目标t,然后调用目标tt。
  2. 目标t调用目标ttt,目标tt调用目标tttt。
  3. 目标t定义属性aa,目标ttt修改属性aa。
  4. 目标tttt尝试打印属性aa的值。
  5. 简而言之,我们有:MAIN -> {t -> {ttt->修改aa,定义aa},tt -> tttt -> 打印aa}

但是在目标tttt中,我们无法“看到”aa的更新值(由ttt!)。如何使该值对目标tttt可见?

整个脚本如下:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="MAIN" >
  <Target Name="MAIN" >
    <CallTarget Targets="t" />
    <CallTarget Targets="tt" />
  </Target>

  <Target Name="t">
    <Message Text="t" />
    <PropertyGroup>
      <aa>1</aa>
    </PropertyGroup>
    <CallTarget Targets="ttt" />
  </Target>

  <Target Name="tt">
    <Message Text="tt" />
    <CallTarget Targets="tttt" />
  </Target>

  <Target Name="ttt">
    <PropertyGroup>
      <aa>122</aa>
    </PropertyGroup>
    <Message Text="ttt" />
  </Target>

  <Target Name="tttt">
    <Message Text="tttt" />
    <Message Text="tttt:$(aa)" />
  </Target>

</Project>

在上面的脚本中,如果我在目标t中删除aa定义,在目标tttt中,aa将会是122,就像在目标ttt中更新的一样。我不明白发生了什么。 - Nam G VU
1个回答

2

正如在回答另一篇帖子时所说,您应该使用目标之间的依赖关系来建模MSBuild项目,而不是一个接一个地调用目标。

<Project DefaultTargets="tttt" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="t">
        <Message Text="t" />
            <PropertyGroup>
                <aa>1</aa>
            </PropertyGroup>
     </Target>

     <Target Name="tt" DependsOnTargets="t">
         <Message Text="tt" />
     </Target>

     <Target Name="ttt" DependsOnTargets="t;tt">
         <PropertyGroup>
             <aa>122</aa>
         </PropertyGroup>
         <Message Text="ttt" />
     </Target>

     <Target Name="tttt" DependsOnTargets="t;tt;ttt">
         <Message Text="tttt" />
         <Message Text="tttt:$(aa)" />
     </Target>
</Project>

我使用的一种方法是将目标定义为我的最终目标,并将其放入项目的DefaultTargets中。

然后添加所有需要完成以实现此目标的事情。


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