我有一个包含多个项目的解决方案,我希望他们能够访问一组在解决方案级别的公共文件中定义过一次的共享属性。
使用下面的代码大部分工作正常,我可以使用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;这很好,但是当它被用作条件的一部分(可选地包括嵌入式资源)时,条件永远不会得到满足。
有没有办法让导入的属性适用于条件?
答案 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>
这就是:
CommonSettingsTarget
,该目标将在执行时定义MyCustomProperty
。不是现在。ItemGroup
,因此评估条件。它返回false
,因为尚未定义MyCustomProperty
。BeforeBuild
。CommonSettingsTarget
。现在定义MyCustomProperty
。BeforeBuild
,因此会运行BeforeBuild
。在那里,您评估已在步骤4中定义的MyCustomProperty
。作为解决方案,请移除CommonSettingsTarget
目标,并将PropertyGroup
定义为CommonSettings.targets中Project
的子项:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MyCustomProperty>Sample</MyCustomProperty>
</PropertyGroup>
</Project>
在项目文件中,您应该删除InitialTargets="CommonSettingsTarget"
。