MSBuild条件基于导入的属性

时间:2017-05-09 11:42:47

标签: visual-studio msbuild

我有一个包含多个项目的解决方案,我希望他们能够访问一组在解决方案级别的公共文件中定义过一次的共享属性。

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

所以我在解决方案文件夹中的CommonSettings.targets文件中有以下内容:

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

在上面,我可以看到输出窗口中显示的导入属性为&#34; MyCustomProperty =&#39; Sample&#39;&#34;这很好,但是当它被用作条件的一部分(可选地包括嵌入式资源)时,条件永远不会得到满足。

有没有办法让导入的属性适用于条件?

1 个答案:

答案 0 :(得分: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
  6. 作为解决方案,请移除CommonSettingsTarget目标,并将PropertyGroup定义为CommonSettings.targets中Project的子项:

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

    在项目文件中,您应该删除InitialTargets="CommonSettingsTarget"