MSBuild: Output properties from imported projects

﹥>﹥吖頭↗ 提交于 2019-12-13 04:25:55

问题


Let's say I have a build.proj like this:

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

    <PropertyGroup>
        <CustomAfterMicrosoftCSharpTargets>$(MSBuildThisFileDirectory)Common.Build.targets</CustomAfterMicrosoftCSharpTargets>
        <Configuration>Release</Configuration>
        <Platform>Any CPU</Platform>
        <ProjectProperties>
            Configuration=$(Configuration);
            Platform=$(Platform);
            CustomAfterMicrosoftCSharpTargets=$(CustomAfterMicrosoftCSharpTargets);
        </ProjectProperties>
    </PropertyGroup>

    <ItemGroup>
        <ProjectToBuild Include="$(MSBuildThisFileDirectory)src\Proj\MyApp.csproj" />
    </ItemGroup>

    <Target Name="Build">
        <MSBuild Targets="Build"
                 Projects="@(ProjectToBuild)"
                 Properties="$(ProjectProperties)" />
    </Target>

    <Target Name="AfterBuild" DependsOn="Build">
        <Message Text="ChildProperty: $(ChildProperty)" />
    </Target>
</Project>

In Common.Build.targets, I have a Target that creates a property:

<Target Name="DoSomethingUseful">
    <!-- Do something useful -->
    <CreateProperty Value="SomeComputedThingy">
        <Output TaskParameter="Value" PropertyName="ChildProperty"/>
    </CreateProperty>
</Target>

Now if I build build.proj, I do not see the value of ChildProperty in the message. The output is blank: ChildProperty:.

I was under the impression that any output for a target is merged back to global context after its execution. But it seems that it only applies to anything within that target file.

How do I make ChildProperty bubble up to the parent build.proj?


回答1:


When you are calling <MSBuild> task on dependent projects, read TargetOutputs output parameter of the task. See example from MSDN:

<Target Name="BuildOtherProjects">
    <MSBuild
        Projects="@(ProjectReferences)"
        Targets="Build">
        <Output
            TaskParameter="TargetOutputs"
            ItemName="AssembliesBuiltByChildProjects" />
    </MSBuild>
</Target>

You will also need to ensure the target you are calling in dependent projects correctly populates Returns or Output parameter (Returns takes precedence if used). E.g.:

<Target Name="MyTarget" Inputs="..." Outputs="..." Returns="$(MyOutputValue)">
    <PropertyGroup>
        <MyOutputValue>set it here</MyOutputValue>
    </PropertyGroup>
</Target>


来源:https://stackoverflow.com/questions/28774409/msbuild-output-properties-from-imported-projects

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!