Visual Studio — событие после сборки — ошибки выдачи
-
02-10-2019 - |
Вопрос
У меня есть хороший сценарий пост-сборки, управляемый 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 компилирует проект, она загружает пользовательскую сборку и объект задачи и выполняет задачу.Ошибки, возникающие в конвейере, извлекаются и сообщаются.
Другие советы
Чтобы создать ошибку, предупреждение или сообщение, которое появится в окне списка ошибок, просто войдите в систему 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.