Как вывести список импортированных списков свойств из MSBuild - PullRequest
2 голосов
/ 17 октября 2011

Я строю иерархию листов свойств (многие из которых включены в соответствии с Платформой и Конфигурацией), и я пытаюсь написать набор целей, которые могут помочь диагностировать любые ошибки, которые могут проникнуть.

То, что я хотел бы, это список листов свойств, которые были включены.

Пример:

<ImportGroup Condition="$(Configuration.Contains('Debug'))">
  <Import Project="ps.cpp.config.debug.props"/>
</ImportGroup>
<ImportGroup Condition="$(Configuration.Contains('Release'))">
  <Import Project="ps.cpp.config.release.props"/>
</ImportGroup>

<ImportGroup Condition="'$(Platform)' == 'x64'">
  <Import Project="ps.cpp.plat.x64.props"/>
</ImportGroup>
<ImportGroup Condition="'$(Platform)' == 'Win32'">
  <Import Project="ps.cpp.plat.win32.props"/>
</ImportGroup>

И цель как это:

<Target Name="DumpPropertySheets">
  <!-- This doesn't work! -->
  <!-- <Message Text="%(Import.Project)"/> -->
</Target>

Что должно привести к выводу на консоль, как это, при сборке с msbuild test.vcxproj /t:DumpPropertySheets /p:Platform=x64 /p:Configuration:Debug

DumpPropertySheets:
  ps.cpp.config.debug.props
  ps.cpp.plat.x64.props

1 Ответ

1 голос
/ 18 октября 2011

Не существует очевидного способа сделать то, что вы пытаетесь сделать. Импорты предварительно обрабатываются для объединения всего содержимого в один файл, они не являются типами данных, такими как массивы элементов или свойства, на которые можно ссылаться позже.

Синтаксис% (Import.Project) не работает, поскольку этот синтаксис действителен только для массивов элементов, и вы пытаетесь использовать его для ключевого слова Import , которое не является массивом заполненных элементов .

Также обратите внимание, что использование элементов ImportGroup, окружающих импорт, является необязательным (и, возможно, немного многословным). Следующие две конструкции в файле MSBuild эквивалентны ...

<ImportGroup Condition="$(Configuration.Contains('Debug'))">
   <Import Project="ps.cpp.config.debug.props"/>
</ImportGroup> 

... и (для ясности обернуты строкой) ...

<Import
   Condition="$(Configuration.Contains('Debug'))"
   Project="ps.cpp.config.debug.props" 
   />

Если вы пытаетесь диагностировать ошибки импорта листов свойств, не забудьте о параметре командной строки / pp, который выведет весь предварительно обработанный файл. Вы также можете (по крайней мере, для своих собственных файлов) дать каждому импорту уникальную запись в массиве элементов, например,

<Import
   Condition="$(Configuration.Contains('Debug'))"
   Project="ps.cpp.config.debug.props" 
   />

затем внутри ps.cpp.config.debug.props,

<ItemGroup>
   <_Import Include="$(MSBuildThisFile)" />
</ItemGroup>

тогда позже в вашей сборке вы можете получить то, что, по-видимому, ищете, в некоторой степени, с

<Target Name="DumpPropertySheets">
   <!-- This does work! -->
   <Message Text="%(_Import.Identity)" />
</Target>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...