Поддерживает ли Visual Studio добавление задач MSBuild в проекты?

Я пытаюсь добавить несколько простых задач MSBuild в проект Visual Studio (VS 2012 Express) - в частности, чтобы создать подкаталог, а затем скопировать некоторые файлы в подкаталог выходного каталога, готовые для упаковки.

Я вижу, что VS поддерживает настраиваемые шаги сборки, которые представляют собой вызовы из командной строки. Однако, поскольку VS основан на MSBuild, должна быть возможность добавлять их напрямую как задачи MSBuild как задание копирования в предопределенная цель AfterBuild.

Я не могу найти способ добавить такие задачи в рамках Visual Studio. В документации говорится об этом только с точки зрения MSBuild, а не о том, как это работает в пользовательском интерфейсе Visual Studio.. Также, похоже, не обсуждаются свойства, относящиеся к выходным данным сборки и т. Д .; предположительно, они как раз те, которые используются самой msbuild.

Есть ли поддержка управления задачами MSBuild в пользовательском интерфейсе Visual Studio, и это просто искалечено в моем выпуске Express? Или мне нужно взломать XML файла проекта, чтобы добавить задачи MSBuild? Поддерживается ли это и как это должно быть сделано?

Я привык работать с Eclipse и Ant или Maven, где все это поддерживается в среде IDE, хотя, конечно, вы можете взломать XML напрямую. Отсутствие пользовательского интерфейса для управления задачами MSBuild в Visual Studio довольно сбивает с толку. Я упускаю очевидное или искалечен из-за использования бесплатной версии?


person Craig Ringer    schedule 17.09.2014    source источник
comment
Использование Visual Visual Studio для редактирования файлов MSBuild было бы серьезным мероприятием с низкой отдачей. Однако он поддерживает его достаточно хорошо, просто используйте File + Open + File, выберите файл проекта. Щелкните стрелку на кнопке «Открыть», выберите «Открыть с помощью» и выберите редактор XML. Возможно, вам придется выгрузить проект, если он в данный момент загружен. Имейте в виду, что это как подростковый секс, одна ошибка, и вы будете поддерживать ее всю оставшуюся жизнь.   -  person Hans Passant    schedule 17.09.2014
comment
Я редактирую файлы XML в Notepad ++, и мне не нужно сначала выгружать их. При изменении VS перезагружается, или плагин VSCommands обнаруживает и перезагружает все решение. Только в некоторых случаях включенный файл (например, props) требует, чтобы я закрыл решение вручную; даже в этом случае сборка видит последние файлы, даже если среда IDE не обновлялась.   -  person JDługosz    schedule 18.09.2014


Ответы (3)


Для проектов C ++ можно использовать свойство

<CppCleanDependsOn>DeleteOutputs;$(CppCleanDependsOn)</CppCleanDependsOn>

вместо того, чтобы определять цель BeforeClean, как вы это делали.

Из того, что я читал, следует избегать CallTarget. В вашем примере вы должны использовать DependsOnTargets для этого, как вы видите во многих фиктивных целях в файлах, поставляемых MS. Аналогичный механизм функции, в которой цель просто «вызывает» другие цели, выполняется с помощью DependsOnTargets. Процесс на самом деле не то же самое, что процедурное программирование.

Intellisense: я никогда им не пользуюсь. Это верно только для условных AdditionalIncludeDirectories в файле props? Продолжайте и отредактируйте запись в файле proj, куда ее поместила среда IDE, если вы редактируете свойство в среде IDE, выбрав только одну конфигурацию.

person JDługosz    schedule 18.09.2014

Я использую VS2010 Pro, и он не раскрывает цель AfterBuild, по крайней мере, в проектах C ++, что я и делаю. Как видите, в нем есть «События», которые, согласно тому, что я читал, предназначены для обратной совместимости с преобразованными проектами из VSBuild. Я согласен, лучше использовать задачу MSBuild, чем командный сценарий.

Забудьте об интерфейсе. Он создан для поддержки бесплатного редактирования файлов XML, а также для продолжения использования пользовательского интерфейса, поскольку он уважает то, что у вас там есть, и использует метки для своих собственных материалов, чтобы он мог их найти для обновления.

Но для аккуратности можно использовать страницу свойств; автономный XML-файл с именем * .props и поместите в него то, что хотите. Затем добавьте этот файл реквизита в проекты с помощью пользовательского интерфейса. Вы не будете вручную редактировать файл проекта, который поддерживает пользовательский интерфейс, и он не будет касаться файла props, если вы не пройдете через представление диспетчера свойств и не откроете его явно.

О, я также помню, что видел дополнительные стандартные цели, например, «Упаковать и опубликовать». Возможно, они не используются в вашем типе проекта, но вы все равно можете использовать эти точки входа.

person JDługosz    schedule 17.09.2014
comment
Да, я уже использую листы свойств. Однако они удручающе ограничены - в частности, кажется, что если вы используете условия для свойств или групп свойств, которые влияют на такие вещи, как пути заголовков, IntelliSense имеет корову и не может найти заголовки, даже если сама сборка завершается успешно. - person Craig Ringer; 17.09.2014
comment
Надеюсь, что только что добавленный ответ проясняет, что я делаю. Я до сих пор не могу поверить, что в VS нет пользовательского интерфейса для редактирования целей, задач, групп элементов MSBuild и т. Д. Нет даже условных свойств в листах свойств. - person Craig Ringer; 17.09.2014

(Прочитав еще немного, я понял, как это работает):

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
comment
В IDE есть действие по добавлению .targets в список настройки в самом низу файла * proj. Я думаю, что Add Build Customization будет искать цели и реквизиты с одним и тем же базовым именем и включать их в разные места. - person JDługosz; 18.09.2014