我试图了解输出和输出背后的逻辑。返回参数。在使用输出和输出的情况下,我发现了非常令人困惑的行为。返回属性。
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)
答案 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>