(Прочитав еще немного, я понял, как это работает):
Visual Studio, похоже, не поддерживает расширенное редактирование проекта MSBuild, хотя современные файлы vcxproj
- это просто файлы проекта MSBuild с кучей дополнительных помеченных свойств и других записей для специфики Visual Studio IDE. Итак, вам нужно взломать XML проекта.
Чтобы сделать его чище, добавьте только одну строку в ваш фактический vcxproj
файл - включите .targets
файл, который содержит остальные настройки вашей сборки. например, непосредственно перед концом файла проекта вставьте:
<Import Project="pg_sysdatetime.targets" />
</Build>
Теперь создайте свой .targets
файл с той же структурой, что и любой другой проект MSBuild. Вот мой из проекта, над которым я работал:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- MSBuild extension targets for Visual Studio build -->
<PropertyGroup>
<DistDir>pg_sysdatetime_pg$(PGMAJORVERSION)-$(Configuration)-$(Platform)</DistDir>
</PropertyGroup>
<ItemGroup>
<DocFiles Include="README.md;LICENSE"/>
<ExtensionSourceFiles Include="pg_sysdatetime--1.0.sql;pg_sysdatetime.control"/>
<ExtensionDll Include="$(TargetDir)\pg_sysdatetime.dll"/>
</ItemGroup>
<Target Name="CopyOutputs">
<Message Text="Copying build product to $(DistDir)" Importance="high" />
<Copy
SourceFiles="@(DocFiles)"
DestinationFolder="$(DistDir)"
/>
<Copy
SourceFiles="@(ExtensionDll)"
DestinationFolder="$(DistDir)\lib"
/>
<Copy
SourceFiles="@(ExtensionSourceFiles)"
DestinationFolder="$(DistDir)\share\extension"
/>
</Target>
<Target Name="DeleteOutputs">
<Message Text="Deleting $(DistDir)" Importance="normal" />
<Delete Files="$(DistDir)"/>
</Target>
<!-- Attach to Visual Studio build hooks -->
<Target Name="BeforeClean">
<CallTarget Targets="DeleteOutputs"/>
</Target>
<Target Name="AfterBuild">
<CallTarget Targets="CopyOutputs"/>
</Target>
</Project>
Он может содержать любые задачи MSBuild, сгруппированные по целевым объектам. Он также может иметь группы свойств, группы элементов и все остальное, что поддерживает MSBuild.
Для интеграции в Visual Studio вы добавляете целевые объекты со специальными именами, которые вызывают то, что вы хотите. Здесь вы можете видеть, что я определил цели BeforeClean
и AfterBuild
. Вы можете получить поддерживаемые цели из документации по интеграции VS.
Теперь, когда я собираю или перестраиваю, автоматически создается новый каталог, содержащий DLL продукта и набор статических файлов, готовых к заархивированию. Если бы я хотел, я мог бы добавить пакет Nuget для расширений сообщества MSBuild и использовать задачу Zip, чтобы объединить все это в zip-файл в конце.
Кстати, хотя вы можете определять свойства в своих .targets
файлах, лучше вместо этого определять их в листах свойств. Таким образом, они будут видны в пользовательском интерфейсе.
person
Craig Ringer
schedule
17.09.2014