Visual Studio - сообщение о событиях сборки - ошибки при опрокидывании

У меня есть хороший пост-сборщик script с командной оболочкой с Power-shell, который делает несколько волшебных mumbo-jumbo для вытаскивания всех наших плагинов в нужное место после их компиляции и сортировки их зависимостей с мастер-проектом решения.

Моя проблема в том, что иногда, когда я делаю что-то глупое, я могу закончить в состоянии, когда мой script не может выполнить его операцию правильно и выдает исключение в powershell с подробностями о том, что пошло не так.

Есть ли способ получить эти исключения, чтобы перейти к окну ошибки Visual Studio, так что, когда моя пост-сборка завершится неудачно, vstudio получает уведомление об отказе и красиво форматирует его в окне рядом со всеми другими предупреждениями/ошибками?

Изменить: Это пояснение к тому, что я идеально ищу.

удалена мертвая ссылка ImageShack

Примечание.. Если вы приземлились здесь, чтобы узнать, как создавать персонализированные сообщения об ошибках в Visual Studio (когда вы контролируете сообщения об ошибках), вы можете увидеть Roy Tinker Answer, чтобы узнать, как настроить ваши сообщения, чтобы они отображались. Если вы заинтересованы в обнаружении неожиданных ошибок, которые вы не можете контролировать, или найти более полное решение, см. Принятый ответ.

Ответы

Ответ 1

Вот два подхода для прерывания сборки при ошибках PowerShell script.

Используйте exit() для завершения процесса PowerShell

Чтобы вернуть код состояния из script, который, если не равен нулю, будет отображаться в списке ошибок, используйте следующее:

exit(45) # or any other non-zero number, for that matter.

Это не точно возвращает текст ошибки в ваш список ошибок, но завершает script и получает немного что-то в вашем списке ошибок, чтобы указать, какая команда до или после сборки была неудачной.

Используйте пользовательскую задачу MSBuild для запуска PowerShell script

Я потратил немного времени на разработку деталей выполнения PowerShell script в задаче MSBuild. У меня полная статья с образцом кода в моем блоге. Проверьте это, так как это включает в себя больше обсуждений и некоторое объяснение того, как обрабатывать примеры проектов. Это, вероятно, не полное или идеальное решение, но я получил его "Работа над моей машиной" TM с помощью очень простого script.

Этот подход обеспечивает точность строк и столбцов при представлении сообщений об ошибках PowerShell и даже поддерживает поведение, которое мы привыкли в Visual Studio с помощью двойного щелчка мышью, которое мы привыкли. Если этого не хватает, я уверен, что вы сможете расширить его, чтобы удовлетворить ваши потребности. Кроме того, в зависимости от вашей версии Visual Studio вам могут понадобиться массажные детали, такие как справочные версии сборок.

Сначала создайте пользовательскую задачу MSBuild в проекте библиотеки классов. Библиотека должна ссылаться на следующие сборки для интеграции MSBuild и PowerShell. (Обратите внимание, что для этого примера требуется PowerShell 2.0.)

  • Microsoft.Build.Framework(GAC)
  • Microsoft.Build.Utilities.v3.5 (GAC)
  • System.Management.Automation(из C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0)

Создайте класс задачи и покажите свойство, чтобы указать путь к PowerShell script, например:

using System.IO;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

public class PsBuildTask : Task
{
    [Required]
    public string ScriptPath { get; set; }

    public override bool Execute()
    {
        // ...
    }
}

В рамках метода Execute() запустите время запуска PowerShell, выполните команду script и соберите ошибки. Используйте свойство Log для регистрации ошибок. По завершении закройте рабочую область и верните true, если script не зарегистрировал ошибок.

// create Powershell runspace
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();

// create a pipeline and feed it the script text
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(". " + ScriptPath);

// execute the script and extract errors
pipeline.Invoke();
var errors = pipeline.Error;

// log an MSBuild error for each error.
foreach (PSObject error in errors.Read(errors.Count))
{
    var invocationInfo = ((ErrorRecord)(error.BaseObject)).InvocationInfo;
    Log.LogError(
        "Script",
        string.Empty,
        string.Empty,
        new FileInfo(ScriptPath).FullName,
        invocationInfo.ScriptLineNumber,
        invocationInfo.OffsetInLine,
        0,
        0,
        error.ToString());
}

// close the runspace
runspace.Close();

return !Log.HasLoggedErrors;

И что это. С этой сборкой мы можем настроить другой проект на использование задачи MSBuild.

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

Сначала зарегистрируйте задачу только внутри <Project> node файла .csproj следующим образом:

<UsingTask TaskName="PsBuildTask"
           AssemblyFile="..\Noc.PsBuild\bin\Debug\Noc.PsBuild.dll" />

Имя_задачи должно быть именем класса задачи, хотя, казалось бы, пространство имен не требуется. AssemblyFile - это абсолютный путь к пользовательской сборке задач MSBuild или относительный путь к файлу .csproj. Для сборок в GAC вы можете использовать атрибут AssemblyName.

После регистрации задача может быть использована в событиях до и после сборки. Настройте событие сборки внутри элемента <Project> файла .csproj следующим образом:

<Target Name="AfterBuild">
    <PsBuildTask ScriptPath=".\script.ps1" />
</Target>

И что это. Когда Visual Studio компилирует проект, он загружает пользовательский объект сборки и задачи и выполняет задачу. Ошибки, поднятые конвейером, извлекаются и сообщаются.

Screenshot

Ответ 2

Чтобы создать сообщение об ошибке, предупреждение или сообщение, которое появится в окне списка ошибок, просто зарегистрируйте сообщение в stdout или stderr в следующем формате из script, инициированного событием до или после сборки. Прокомментируйте или отредактируйте, если есть официальная спецификация; это только то, что я смог вывести методом проб и ошибок и просмотром вывода MSBuild. Квадратные скобки обозначают "необязательно":

FilePath[(LineNumber[,ColumnNumber])]: MessageType[ MessageCode]: Description

В качестве примера:

E:\Projects\SampleProject\Program.cs(18,5): error CS1519: Invalid token '}' in class, struct, or interface member declaration

Дополнительные примеры см. в окне вывода для любой ошибки/предупреждения/сообщения, которые могут возникнуть при запуске сборки в Visual Studio.