如何在MsBuild?</target>中的<target>节点外访问项元数据

时间:2014-12-20 21:02:28

标签: c++ visual-studio msbuild nuget msvcrt

我试图为我的NuGet包创建一个.targets文件,该文件将链接到一个正确的.lib文件,具体取决于项目的C ++运行时库。 This answer建议为此使用%(ClCompile.RuntimeLibrary)元数据。但似乎无法在<Target>节点之外访问元数据!并且库依赖项添加在根<ItemDefinitionGroup>节点下的<Project>节点中。

这是SSCCE:

<?xml version="1.0" encoding="us-ascii"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <ClCompile Include="main.cpp">
      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
    </ClCompile>
  </ItemGroup>
  <PropertyGroup>
    <RuntimeLibrary>%(ClCompile.RuntimeLibrary)</RuntimeLibrary>
  </PropertyGroup>
  <Target Name="Build">
    <Message Text="Property = $(RuntimeLibrary)" Importance="high" />
    <Message Text="Metadata = %(ClCompile.RuntimeLibrary)" Importance="high" />
  </Target>
</Project>

使用MsBuild运行它会产生:

Property = %(ClCompile.RuntimeLibrary)
Metadata = MultiThreadedDebugDLL

同一语句%(ClCompile.RuntimeLibrary)<Target>节点内使用时会扩展为该值,但在<PropertyGroup>节点外<Target>节点中使用时则不会。

那么如何访问运行时库元数据值以添加引用正确的库?

更新:建议但不满意的解决方法是定义RuntimeLibrary,如下所示:

<RuntimeLibrary>@(ClCompile->'%(RuntimeLibrary)')</RuntimeLibrary>

在这种情况下,初始脚本的输出是正确的,但我的任务仍未解决,因为我想在条件中使用此属性。所以,如果我添加以下内容:

<PropertyGroup Condition="'$(RuntimeLibrary)'=='MultiThreadedDebugDLL'">
  <TestProp>defined</TestProp>
</PropertyGroup>
...
<Message Text="TestProp = $(TestProp)" Importance="high" />

TestProp未定义。如何使这项工作符合条件?

1 个答案:

答案 0 :(得分:1)

请尝试以下方法:

  <PropertyGroup>
    <RuntimeLibrary>@(ClCompile->'%(RuntimeLibrary)')</RuntimeLibrary>
  </PropertyGroup>

使用@符号可以引用项目列表。

还有an example on StackOverflow