Вопрос

У меня есть хороший сценарий пост-сборки, управляемый Power Shell, который делает какую-то волшебную ерунду для переноса всех наших плагинов в правильное место после их компиляции и сортировки их зависимостей с помощью главного проекта решения.

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

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

Редактировать:Это разъяснение того, что я в идеале ищу.

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

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

Это было полезно?

Решение

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

Использовать exit() завершить процесс PowerShell

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

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

При этом текст ошибки не попадает в ваш список ошибок, но он завершает сценарий и получает что-то в вашем списке ошибок, чтобы указать, какая команда до или после сборки завершилась неудачно.

Используйте пользовательскую задачу MSBuild для выполнения сценария PowerShell.

Я потратил немного времени на детализацию выполнения сценария PowerShell в задаче MSBuild.У меня есть полная статья с примером кода в моем блоге.Обязательно ознакомьтесь с ним, так как он включает в себя дополнительные обсуждения и некоторые объяснения того, как работать с примерами проектов.Вероятно, это не полное и не идеальное решение, но я понял, что оно работает на моей машине.ТМ с очень простым сценарием.

Этот подход обеспечивает точность строк и столбцов при сообщении об ошибках 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 eference Assemblies\Microsoft\WindowsPowerShell\v1.0)

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

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, выполните сценарий и соберите ошибки.Использовать Log свойство для регистрации ошибок.По завершении закройте пространство выполнения и верните true, если сценарий не зарегистрировал ошибок.

// 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.

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

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

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

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

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

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

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

Screenshot

Другие советы

Чтобы создать ошибку, предупреждение или сообщение, которое появится в окне списка ошибок, просто войдите в систему STDOUT или STDERR в следующем формате из скрипта, инициированного событием Pre- или после сборки. Пожалуйста, просьба прокомментировать или отредактировать, если есть официальный спектр; Это только то, что я смог вывести по пробной и ошибке и просмотрев вывод 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top