MSBuild令人困惑的行为与目标输出&返回

时间:2015-03-04 09:46:13

标签: .net build msbuild automation build-system

我试图了解输出和输出背后的逻辑。返回参数。在使用输出和输出的情况下,我发现了非常令人困惑的行为。返回属性。

e.x。我创建了一个包含2个目标的项目" Build"和" InternalTarget"。第一个目标通过Outputs属性定义其输出,第二个目标通过Returns属性定义输出。所以,如果我通过MSBuild任务调用Build target,我就无法获得任何输出 - 它总是空的!但是如果我注释掉第二个目标(无论如何都是未使用的),输出会神奇地出现。

为什么会发生?

example.proj

<Project ToolsVersion="4.0"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    
    <Target Name="Build" 
            Outputs="Build executed">
        <Message Text="Build executing ..." />
    </Target>

    <Target Name="_InternalTarget"
            Returns="_InternalTarget executed">
        <Message Text="_InternalTarget executing ..." />
    </Target>
</Project>

build.proj

<Project ToolsVersion="4.0"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <_ProjectsToBuild Include="example.proj" />
    </ItemGroup>

    <PropertyGroup>
        <_ProjectsToBuildProperties>
            Configuration=Debug;
        </_ProjectsToBuildProperties>
    </PropertyGroup>

    <Target Name="Build">
        <MSBuild Targets="Build"
                 Projects="@(_ProjectsToBuild)"
                 Properties="$(_ProjectsToBuildProperties)">
            <Output TaskParameter="TargetOutputs"
                    ItemName="_ProjectsToBuildOutput" />
        </MSBuild>

        <Message Text="Output: @(_ProjectsToBuildOutput)." />
    </Target>    
</Project>

输出

Build started 3/4/2015 12:41:21 PM.
Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" on node 1 (default targets).
Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" (1) is building "C:\Development\Sources\MSBuildReturn
sExample\example.proj" (2) on node 1 (Build target(s)).
Build:
  Build executing ...
Done Building Project "C:\Development\Sources\MSBuildReturnsExample\example.proj" (Build target(s)).

Build:
  Output: .
Done Building Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" (default targets).


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

1 个答案:

答案 0 :(得分:8)

来自Target element documentation备注部分:

  

在MSBuild 4之前,目标会返回输出属性中指定的所有项目。要做到这一点,MSBuild必须记录这些项目,以防后续构建中的任务请求它们。由于无法指出哪些目标具有呼叫者需要的输出,因此MSBuild在所有已调用的目标上累积了所有输出中的所有项目。这会导致具有大量输出项的构建的扩展问题。

     

如果用户在项目中的任何目标元素上指定返回,则只有那些目标返回返回 属性记录这些项目。

基于以上所述,如果您希望看到&#34;输出:构建已执行。&#34;您应该将 example.proj 修改为:

<Project ToolsVersion="4.0"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    
    <Target Name="Build" 
            Returns="Build executed">
        <Message Text="Build executing ..." />
    </Target>

    <Target Name="_InternalTarget"
            Returns="_InternalTarget executed">
        <Message Text="_InternalTarget executing ..." />
    </Target>
</Project>
相关问题