Используйте метаданные фильтра в пользовательском инструменте сборки 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="<Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
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, который не имеет документов.