如何在 <Target> MsBuild 中访问节点外部的项目元数据?

How to access item metadata outside <Target> node in MsBuild?

本文关键字:外部 节点 项目 元数据 访问 MsBuild lt Target gt      更新时间:2023-10-16

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

这是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未定义。我如何使它适用于条件?

请尝试以下操作:

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

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

在StackOverflow上也有一个例子。