Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net MSBuild将行为与目标输出混淆&;退换商品_.net_Build_Msbuild_Automation_Build System - Fatal编程技术网

.net MSBuild将行为与目标输出混淆&;退换商品

.net MSBuild将行为与目标输出混淆&;退换商品,.net,build,msbuild,automation,build-system,.net,Build,Msbuild,Automation,Build System,我试图理解输出和返回参数背后的逻辑。在使用Outputs&Returns属性的情况下,我发现了非常混乱的行为 e、 我创建了一个有两个目标的项目“构建”和“内部目标”。第一个目标通过Outputs属性定义其输出,第二个目标通过Returns属性定义输出。所以,如果我通过MSBuild任务调用Build target,我将无法获得任何输出-它总是空的!但是,如果我注释掉第二个目标(无论如何都没有使用),输出就会神奇地出现 为什么会发生 示例项目 <Project ToolsVersion="

我试图理解输出和返回参数背后的逻辑。在使用Outputs&Returns属性的情况下,我发现了非常混乱的行为

e、 我创建了一个有两个目标的项目“构建”和“内部目标”。第一个目标通过Outputs属性定义其输出,第二个目标通过Returns属性定义输出。所以,如果我通过MSBuild任务调用Build target,我将无法获得任何输出-它总是空的!但是,如果我注释掉第二个目标(无论如何都没有使用),输出就会神奇地出现

为什么会发生

示例项目

<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>