如何在msbuild中使用目标的输出参数

时间:2011-02-22 13:29:42

标签: msbuild

我正在尝试理解一些MSBuild概念(我熟悉NAnt)。

我尝试初始化目标中的某些属性,然后在另一个中使用它。这是一个例子

<propertygroup>
 <MyProp>X</MyProp>
</propertygroup>

<target name="Main">
 <message text="$(MyProp)"/> <!--display 'X'-->
 <CallTarget Target="Sub">
   <Output TaskParameter="localProp" PropertyName="MyProp"/>
 </CallTarget>
<message text="$(MyProp)"/> <!-- should display 'Y'-->
</target>

<target name="Sub" Outputs=$(localProp)>
 <propertygroup>
  <localProp>Y</localProp>
 </propertygroup>
</target>

它当然不起作用。

2 个答案:

答案 0 :(得分:6)

您将目标上定义的输出与任务的输出参数混淆。

目标的输出用于依赖性分析:

MSBuild Target Element

MSBuild Transforms - Dependency Analysis

任务的输出参数用于返回数据:

Simple Example Here

答案 1 :(得分:6)

除了元素情况下的一些小的语法错误(即target-&gt; Target)之外,还有两个主要的事情需要修复才能使它工作: 1)TaskParameter属性应设置为&#34; TargetOutputs&#34; 2)Sub目标的Outputs属性需要用引号

包围

这是一个有效的例子:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Main">

    <PropertyGroup>
        <MyProp>X</MyProp>
    </PropertyGroup>

    <Target Name="Main">
        <Message text="$(MyProp)"/> <!--display 'X'-->
        <CallTarget Targets="Sub">
            <Output TaskParameter="TargetOutputs" PropertyName="MyProp"/>
        </CallTarget>
        <Message text="$(MyProp)"/> <!-- should display 'Y'-->
    </Target>

    <Target Name="Sub" Outputs="$(localProp)">
        <PropertyGroup>
          <localProp>Y</localProp>
        </PropertyGroup>
    </Target>
</Project>

以上输出:

Microsoft (R) Build Engine version 4.6.1055.0
[Microsoft .NET Framework, version 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 5/6/2016 9:51:37 AM.
Project "C:\workspace\dev\msbuild\temp.msbuild" on node 1 (default targets).
Main:
  X
  Y
Done Building Project "C:\workspace\dev\msbuild\temp.msbuild" (default targets).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.07