Используйте метаданные фильтра в пользовательском инструменте сборки VS2012 MSBuild

У меня есть проблема, которую я хочу решить изящно, но пока не знаю, как это сделать.

В моем решении C++ (VS2012) у меня есть проект, который содержит все файлы.dll, которые должны быть скопированы в Output-Directory для полного развертывания. Я также написал небольшой Custom-Tool для копирования.

Актуальная проблема заключается в том, что нам нужно развернуть разные.dll для разных конфигураций (Win32/x64/Debug/Release), и мы должны установить ExcludedFromBuildсвойство для каждого файла и каждой конфигурации вручную. Я хотел бы, чтобы это свойство устанавливалось автоматически в зависимости от того, в каком фильтре находятся файлы. Чтобы лучше увидеть, какой.dll скопирован для какой конфигурации, я организовал их в фильтры со следующей структурой.

  • Win32
    • отлаживать
    • Релиз
  • x64
    • отлаживать
    • Релиз

Когда я смотрю в vcxproj.filters файл, то записи выглядят следующим образом.

<CopyFiles Include="..\bin.x64\icudt54d.dll">
  <Filter>x64\Debug</Filter>
</CopyFiles>

Поэтому я подумал, что должен иметь возможность получить доступ к фильтру внутри цели копирования, используя %(CopyFiles.Filter)

<Target Name="AddInputsAccordingToFilter">
  <ItemGroup>
    <CopyFiles Include="@(CopyFiles)" Condition="%(CopyFiles.Filter.StartsWith('$(Platform)') And %(CopyFiles.Filter.EndsWith('$(Configuration)')"/>
  </ItemGroup>
</Target>

Но это никогда не работало, и, пытаясь выяснить проблему, я обнаружил, что %(CopyFiles.Filter) всегда пусто, потому что .vcxproj.filters не импортируется в .vcxproj файл. Я пытался вручную добавить импорт в .vcxproj.filters файл, но тогда фильтры в Visual Studio были полностью испорчены.

Кто-нибудь знает способ автоматизации этого процесса, не испортив проект Visual Studio?

1 ответ

Решение

Файл.filters не участвует в процессе сборки, но может быть запрошен как любой xml-файл с помощью задачи XmlPeek. Попробуйте следующее:

<Target Name="AddInputsAccordingToFilter">
  <XmlPeek Namespaces="&lt;Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             XmlInputPath="$(MSBuildProjectFile).filters"
             Query="/n:Project/n:ItemGroup/n:CopyFiles[starts-with(n:Filter, '$(Platform)')]/@Include">
    <Output TaskParameter="Result" ItemName="FilesToCopy" />
  </XmlPeek>
  <ItemGroup>
    <CopyFiles Include="@(FilesToCopy)"/>
  </ItemGroup>    
</Target>

Примите во внимание, что это решение основано на формате файла.filter, который не имеет документов.

Другие вопросы по тегам