.net MSBuild将行为与目标输出混淆&;退换商品
我试图理解输出和返回参数背后的逻辑。在使用Outputs&Returns属性的情况下,我发现了非常混乱的行为 e、 我创建了一个有两个目标的项目“构建”和“内部目标”。第一个目标通过Outputs属性定义其输出,第二个目标通过Returns属性定义输出。所以,如果我通过MSBuild任务调用Build target,我将无法获得任何输出-它总是空的!但是,如果我注释掉第二个目标(无论如何都没有使用),输出就会神奇地出现 为什么会发生 示例项目.net MSBuild将行为与目标输出混淆&;退换商品,.net,build,msbuild,automation,build-system,.net,Build,Msbuild,Automation,Build System,我试图理解输出和返回参数背后的逻辑。在使用Outputs&Returns属性的情况下,我发现了非常混乱的行为 e、 我创建了一个有两个目标的项目“构建”和“内部目标”。第一个目标通过Outputs属性定义其输出,第二个目标通过Returns属性定义输出。所以,如果我通过MSBuild任务调用Build target,我将无法获得任何输出-它总是空的!但是,如果我注释掉第二个目标(无论如何都没有使用),输出就会神奇地出现 为什么会发生 示例项目 <Project ToolsVersion="
<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>
<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>
从,备注部分:
在MSBuild 4之前,Target返回了在Outputs属性中指定的所有项。为此,MSBuild必须记录这些项,以防生成中稍后的任务请求它们。由于无法指示哪些目标具有调用方需要的输出,因此MSBuild在所有调用的目标上累加了所有输出中的所有项。这会导致具有大量输出项的生成出现缩放问题
如果用户在项目中的任何目标元素上指定了一个返回,则只有那些具有返回属性的目标才会记录这些项
因此,基于以上内容,如果您希望看到“输出:构建已执行”。您应该将示例.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>
你读了吗<代码>输出应为文件名,返回
应为项目名。您只需输入字符串,空格分隔。不确定你期望会发生什么?这只是为了举例说明。如果使用适当的文件名或项目名,则不会更改任何内容。这里的混乱之处在于,如果我在项目文件中添加任何带有Returns属性的目标(甚至没有使用),我将不会得到任何输出。如果我只是删除或注释这个未使用的目标,我将获得预期的输出(“构建已执行”)。嗯,这一点确实不错。不知道发生了什么;在example.proj中,在构建目标上使用返回而不是输出可以解决问题,或者在_InternalTarget上使用输出,但是由于某种原因,混合使用这两种方法是行不通的。有趣的是:P@stijn您链接的MSDN页面的备注部分是关键:)是的,就是它!下一段还明确提到了目标返回的特定行为。谢谢
<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>