Как получить доступ к метаданным элемента за пределами & lt; Target & gt; узел в MsBuild?

Я пытаюсь сделать .targets файл для моего пакета NuGet, который будет ссылаться на правильный .lib файл в зависимости от библиотеки времени выполнения C ++ проекта. Этот ответ рекомендует использовать %(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 не определено Как мне сделать эту работу для условий?

0

Решение

Вместо этого попробуйте следующее:

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

Использование символа @ позволяет ссылаться на списки элементов.

Существует также пример на StackOverflow.

1

Другие решения


По вопросам рекламы [email protected]