2017-05-09 87 views
3

我有一个包含多个项目的解决方案,我希望它们都能访问一组共享属性,这些属性在解决方案级别的普通文件中定义过一次。基于导入属性的MSBuild条件

这大多工作正常,使用下面的代码,我可以在BeforeBuild目标中使用导入的属性,但是我遇到的问题是我无法在条件中使用导入的属性。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="CommonSettingsTarget"> 
     <PropertyGroup> 
      <MyCustomProperty>Sample</MyCustomProperty> 
     </PropertyGroup> 
    </Target> 
</Project> 

在我的项目文件我:

<Project ToolsVersion="14.0" DefaultTargets="Build" InitialTargets="CommonSettingsTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(SolutionDir)CommonSettings.targets" /> 

    <ItemGroup> 
    <EmbeddedResource Include="EmbeddedDocument.txt" Condition=" '$(MyCustomProperty)' == 'Sample' " /> 
    </ItemGroup> 

    <Target Name="BeforeBuild"> 
    <Message Text="MyCustomProperty='$(MyCustomProperty)'" Importance="high" /> 
    </Target> 
</Project> 

在上,我可以看到我的进口

所以我的在解决一个文件夹中的文件CommonSettings.targets以下属性在输出窗口中显示为“MyCustomProperty ='Sample'”,这很棒,但是当它用作条件的一部分(可选地包含嵌入资源)时,条件永远不会满足。

有什么办法可以使导入的属性在条件下工作吗?

+1

其他一些建议:如果您切换到VS 2017/MSbuild 15,您可以简单地命名导入的文件“Directory.Build.props”,它会自动导入到该级别以下的所有项目中。 –

回答

3

由于您的ItemGroup不在目标范围内,但PropertyGroup为,CommonSettingsTarget尚未在评估条件时执行,因此尚未定义MyCustomProperty

Message任务在BeforeBuild目标中调用,该目标取决于CommonSettingsTarget,因此在创建消息时定义了MyCustomProperty


Import想象为将导入的项目复制到项目文件中。其结果将是这样的:

<Project ToolsVersion="14.0" DefaultTargets="Build" InitialTargets="CommonSettingsTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="CommonSettingsTarget"> 
    <PropertyGroup> 
     <MyCustomProperty>Sample</MyCustomProperty> 
    </PropertyGroup> 
    </Target> 

    <ItemGroup> 
    <EmbeddedResource Include="EmbeddedDocument.txt" Condition=" '$(MyCustomProperty)' == 'Sample' " /> 
    </ItemGroup> 

    <Target Name="BeforeBuild"> 
    <Message Text="MyCustomProperty='$(MyCustomProperty)'" Importance="high" /> 
    </Target> 
</Project> 

这是发生了什么:

  1. 你定义一个目标CommonSettingsTarget,当它被执行将定义MyCustomProperty。不是现在。
  2. 您定义ItemGroup并因此评估条件。它返回false,因为MyCustomProperty尚未定义。
  3. 您定义目标BeforeBuild
  4. 您运行初始目标,即CommonSettingsTarget。现在定义了MyCustomProperty
  5. 您运行的默认目标取决于BeforeBuild,因此运行BeforeBuild。在那里,你评估已在步骤4

作为解决方案被定义MyCustomProperty,除去CommonSettingsTarget目标和定义PropertyGroupProject的CommonSettings一个孩子。目标改为:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <MyCustomProperty>Sample</MyCustomProperty> 
    </PropertyGroup> 
</Project> 

在你的项目文件,你应该删除InitialTargets="CommonSettingsTarget"即可。

+0

感谢您的信息wkl。如果我专门定义了项目中的属性,它确实有效,但是我在解决方案中有很多项目需要访问属性,并且每次需要调整时都会更改每个项目中的值他们。我认为项目本身的InitialTargets可能已经做到了,但是,看起来条件总是在任何导入之前进行评估? –

+0

@DanielSmith请看我的编辑。 – wkl

+0

我明白你的意思是现在wkl。它现在完美地导入和使用我的共同属性。所有这些目标我绝对过分复杂。非常感谢 - 我将标记为答案:-) –