запустить пользовательскую цель msbuild из VisualStudio - PullRequest
34 голосов
/ 26 февраля 2011

Предположим, я добавляю пользовательскую цель в файл csproj. Есть ли способ запустить эту цель из визуальной студии? Я не хочу, чтобы это было этапом предварительной или последующей сборки, я просто хочу иметь возможность запускать эту цель (и ее зависимости) из Visual Studio.

Ответы [ 4 ]

39 голосов
/ 26 февраля 2011

Существует простой способ (хотя и не самый удачный) с использованием специального внешнего инструмента.

Предполагается, что файл вашего проекта имеет следующую модификацию:

  <Target Name="CalledFromIde">
    <Error Text="Called from the IDE!" />
  </Target>

Перейти к инструментам |Внешние инструменты и добавьте один из них следующим образом:

  Title:      Called from IDE
  Command:    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
  Arguments:  $(ProjectDir)$(ProjectFileName) /t:CalledFromIde
  Initial directory:  $(ProjectDir)
  Use Output window:  checked

Выполнение этого приводит к выводу:

  Build FAILED.

  "F:\Code\CsProject\CsProject.csproj" (CalledFromIde target) (1) ->
  (CalledFromIde target) -> 
    F:\Code\CsProject\CsProject.csproj(57,5): error : Called from the IDE!

Вы обращаетесь к MSBuild как к внешнему инструменту и запускаете егоцель непосредственно.Вы должны указать полный путь к MSBuild, поскольку IDE не поддерживает те свойства, которые доступны в создаваемой им среде компоновки.

Вы можете подключить это к ярлыку, выяснив, какая команда # этов наборе Tools.ExternalCommand #.

Если вы ищете решение с большей сложностью, оно немного сложнее.Вкратце (для VS2010):

1) Создайте надстройку VS (Файл | Новый | Проект | Другие типы проектов | Расширяемость | Надстройка Visual Studio).Я не уверен, что для этого необходимо установить VS SDK, он доступен в диспетчере расширений.

Выберите в мастере следующие параметры: - Microsoft Visual Studio 2010 - Да, создайтеПункт меню «Инструменты» - загрузка при запуске приложения. Моя надстройка никогда не будет отображать модальный пользовательский интерфейс и может использоваться со сборками командной строки.

2) Добавить ссылки на Microsoft.Build и Microsoft.Build..Framework

3) Найдите реализацию Exec в файле Connect.cs

4) Замените ее следующим кодом:

public void Exec(
    string commandName,
    vsCommandExecOption executeOption,
    ref object varIn,
    ref object varOut,
    ref bool handled)
{
    handled = false;
    if (executeOption != vsCommandExecOption.vsCommandExecOptionDoDefault)
        return;
    if (commandName != "BuildAddin.Connect.BuildAddin")
        return;

    var doc = _applicationObject.ActiveDocument;
    var projectItem = doc.ProjectItem;
    var project = projectItem.ContainingProject;
    var evalProject =
        Microsoft.Build.Evaluation.ProjectCollection
        .GlobalProjectCollection.LoadProject(project.FullName);
    var execProject = evalProject.CreateProjectInstance();

    bool success = execProject.Build("CalledFromIde", null);

    var window = _applicationObject.Windows.Item(Constants.vsWindowKindOutput);
    var output = (OutputWindow)window.Object;
    OutputWindowPane pane = output.OutputWindowPanes.Add("BuildAddin");
    pane.OutputString(success ? "built /t:CalledFromIde" : "build failed");

    handled = true;
    return;
}

5) Лучшая настраиваемая цельво время отладки, поскольку предыдущая ошибка:

  <Target Name="CalledFromIde">
    <WriteLinesToFile File="CalledFromIde.txt" Lines="Called from the IDE!" />
  </Target>

6) В приведенном выше коде нет проверки ошибок для краткости, вам нужно быть намного чище, так как он будет работать в IDE.Надстройка поместит пункт меню в меню «Инструменты».Как написано выше, он просто ищет проект, содержащий активный в данный момент документ редактора, который потребует более качественного соединения для всего, что вы готовите.

Этот метод получает экземпляр механизма сборки из IDE и имеет еговыполнить сборку на отдельном экземпляре проекта.

5 голосов
/ 07 июля 2015

Если вы выполняете сборку внутри Visual Studio, во время сборки будет переменная сборки VisualStudioDir.

Чтобы выполнить только сеанс сборки VS, сделайте следующее:

<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' != ''>
</Target>

Чтобы выполнить только в сборке вне VS, сделайте следующее:

<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' == ''>
</Target>

Вам нужно будет включить файл пользовательских целей одним из двух способов.

  1. Установка переменной среды CustomBeforeMicrosoftCommonTargets
  2. Отредактируйте файл проекта, включив в него файл пользовательских целей, добавив импорт

    <Imports Project="CustomBuildTasks.Targets"><Imports/>
    
3 голосов
/ 01 сентября 2014

Вам не нужно кодировать с Exec, хотя это один из способов сделать это. Проще всего сделать следующее:

Измените атрибут DefaultTargets="Build" на созданную вами собственную цель, скажем "All", например:

DefaultTargets="All"

Затем в вашей пользовательской цели «Все» вы можете использовать атрибут DependsOnTargets, например:

"<Target Name="All" DependsOnTargets="ZipOutputFiles;Build">
  </Target>"

Затем он создаст и поместит zip-файлы в вашу пользовательскую цель "All".

0 голосов
/ 31 декабря 2018

Некоторое время назад у меня возникла та же проблема, и я решил написать надстройку VS.Попробуйте:

MsBuildTaskExplorer

https://github.com/Serg046/MsBuildTaskExplorer

https://marketplace.visualstudio.com/items?itemName=saaseev.MsBuildTaskExplorer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...