MSBuild:导入项目的输出属性
假设我有一个build.proj,如下所示:MSBuild:导入项目的输出属性,msbuild,Msbuild,假设我有一个build.proj,如下所示: <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="AfterBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Cu
<?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>
现在,如果我构建build.proj,我在消息中看不到ChildProperty的值。输出为空:ChildProperty:
我的印象是,目标的任何输出在执行后都会合并回全局上下文。但它似乎只适用于目标文件中的任何内容
如何使ChildProperty冒泡到父build.proj?在依赖项目上调用任务时,请读取任务的targetOutput输出参数。参见以下示例:
试过了,但没用。AssembliesBuiltByChildProjects为空。这就解释了为什么:只返回指定目标的输出,而不返回这些目标所依赖的目标上可能存在的任何输出。@Mrchief,为什么您希望不是这样?当您在C中调用一个返回某个对象的函数时,您看不到该返回是该函数调用的所有内容的某种聚合。当然,调用函数与调用MSBuild中的目标并不是直接的类比,但有点接近。当您需要特定目标的输出时,请使用MSBuild任务或CallTarget任务调用它并使用输出值。我不希望这样。我的问题特别是关于冒泡由一个子目标创建的属性。我同意在全局范围内创建属性,问题是-如何创建?子函数总是可以写入全局变量,是吗?我们不要讨论全局变量是一场邪恶的辩论。我只想把一处房产泡起来。
<Target Name="DoSomethingUseful">
<!-- Do something useful -->
<CreateProperty Value="SomeComputedThingy">
<Output TaskParameter="Value" PropertyName="ChildProperty"/>
</CreateProperty>
</Target>
<Target Name="BuildOtherProjects">
<MSBuild
Projects="@(ProjectReferences)"
Targets="Build">
<Output
TaskParameter="TargetOutputs"
ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
</Target>
<Target Name="MyTarget" Inputs="..." Outputs="..." Returns="$(MyOutputValue)">
<PropertyGroup>
<MyOutputValue>set it here</MyOutputValue>
</PropertyGroup>
</Target>