При просмотре свойств файла в Visual Studio (2010 и выше) можно установить тип элемента в разделе «Общие». Например, для C ++ типом элемента является «C / C ++ compiler».
Доступен тип «Custom Build Tool», но он должен быть полностью настроен для каждого файла, попадающего в эту категорию.
Мои вопросы:
Я нашел ответ, используя следующие ссылки:
Integrating a compiler/assembler in VS ; Using NASM with Visual Studio 2010
Perilbrain на CodeProject: http://www.codeproject.com/Articles/410776/Integrating-a-compiler-assembler-in-VS-Using-NASMPlatform Extensibility - Part 1
Паван Адхарапурапу в блогах MSDN: http://blogs.msdn.com/b/vsproject/archive/2009/06/10/platform-extensibility-part-1.aspxPlatform Extensibility - Part 2
Паван Адхарапурапу в блогах MSDN: http://blogs.msdn.com/b/vsproject/archive/2009/06/18/platform-extensibility-part-2.aspxMSBuild API Reference
на MSDN: https://msdn.microsoft.com/en-us/library/dn715758(v=vs.121).aspx`Оказывается, полная настройка довольно сложна, поэтому я ограничу свой ответ ответом на два моих начальных вопроса с минимальными шагами:
В файле проекта (vcxproj
), включите новое определение сборки (возможно, есть способ включить его в систему, но я еще не изучал его):
<ImportGroup Label="ExtensionTargets">
<Import Project="mybuild.targets" />
</ImportGroup>
Это может пойти прямо перед закрытием </Project>
,
Создайте текстовый файл с именем mybuild.targets
в той же папке, что и vcxproj
файл.
Вставьте следующее в mybuild.targets
:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PropertyPageSchema
Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
</ItemGroup>
</Project>
Этот целевой файл ссылается на XML-файл с более подробной информацией ($(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml
который в этом примере ссылается на mybuild.xml). Создайте mybuild.xml
,
Вставьте следующее в mybuild.xml
:
<?xml version="1.0" encoding="utf-8"?>
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sys="clr-namespace:System;assembly=mscorlib">
<ItemType Name="MYBUILD" DisplayName="My Custom Build" />
</ProjectSchemaDefinitions>
Что мы только что сделали: файл проекта теперь содержит новое определение цели (mybuild.targets
). Этот файл обычно содержит больше информации о том, как выполнить фактическую сборку, но здесь он содержит только включение в mybuild.xml
файл. это mybuild.xml
файл содержит новое определение типа элемента с внутренним именем MYBUILD
и отображаемое имя My Custom Build
, Когда проект будет вновь открыт в Visual Studio, новый тип элемента будет доступен в списке Тип элемента. Выбор этого устанавливает тип этого элемента MYBUILD
и поскольку на данный момент у нас нет определенного правила для такого типа элементов, оно будет просто проигнорировано при сборке.
Это делается в два этапа:
Свяжите расширение файла с типом содержимого. Это делается путем добавления записи в mybuild.xml
как это:
<FileExtension Name="*.myext" ContentType="MYBUILD" />
Свяжите тип содержимого с типом элемента. Это делается путем добавления записи в mybuild.xml
как это:
<ContentType Name="MYBUILD" DisplayName="My Custom Build" ItemType="MYBUILD" />
С этой точки зрения, mybuild.xml
выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sys="clr-namespace:System;assembly=mscorlib">
<ItemType Name="MYBUILD" DisplayName="My Custom Build" />
<FileExtension Name="*.hh" ContentType="MYBUILD" />
<ContentType Name="MYBUILD" DisplayName="My Custom Build" ItemType="MYBUILD" />
</ProjectSchemaDefinitions>
Что мы только что сделали: Visual Studio теперь знает, что расширение .myext
содержит данные типа MYBUILD
, Он также знает, что файлы с содержимым типа MYBUILD
являются предметами типа MYBUILD
, После повторного открытия проекта в Visual Studio, при добавлении файлов с расширением .myext
Visual Studio автоматически установит тип элемента «My Custom Build» для этих файлов.
На данный момент у нас есть расширение файла, связанное с пользовательским типом элемента. Нам нужно связать этот тип элемента с набором правил сборки.
Свяжите тип элемента с целью сборки. В mybuild.targets
Добавьте следующее в ту же ItemGroup, что и наша PropertyPageSchema:
<AvailableItemName Include="MYBUILD">
<Targets>_MYBUILD</Targets>
</AvailableItemName>
Так что теперь это выглядит так:
<ItemGroup>
<PropertyPageSchema
Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
<AvailableItemName Include="MYBUILD">
<Targets>_MYBUILD</Targets>
</AvailableItemName>
</ItemGroup>
Определите пользовательскую цель. Здесь вы должны отобразить все свойства и переменные, которые должны использоваться для настройки задачи сборки. На следующем шаге мы будем использовать задачу сборки, которая использует шаблон командной строки, поэтому в нашей цели мы настроим фактическую командную строку. Это идет прямо под ItemGroup
определено на предыдущем шаге:
<Target Name="_MYBUILD">
<MYBUILD CommandLineTemplate="explorer $(IntDir)"></MYBUILD>
</Target>
Наша командная строка просто откроет окно проводника.
Объявите пользовательскую задачу сборки. Это идет сразу после Target
из предыдущего шага:
<UsingTask TaskName="MYBUILD" TaskFactory="XamlTaskFactory" AssemblyName="Microsoft.Build.Tasks.v4.0">
<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
</UsingTask>
Здесь мы ссылаемся на задачу, которая будет определена в нашем mybuild.xml
файл.
В mybuild.xml
добавьте следующее правило:
<Rule Name="MYBUILD" PageTemplate="tool" DisplayName="My Custom Build" Order="200"/>
Что мы только что сделали: мы сопоставили пользовательский тип элемента с пользовательской целью и пользовательскую задачу сборки, которая открывает окно проводника. Когда мы строим .myext
файлы, теперь мы можем ожидать, что Visual Studio откроет окно обозревателя.
Существуют способы добавить поля конфигурации в окне свойств, сопоставить их с переменными и использовать их для настройки задачи. Это не рассматривается здесь, но обсуждается в ссылках, приведенных в верхней части.