Ответ 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 компилирует проект, он загружает пользовательский объект сборки и задачи и выполняет задачу. Ошибки, поднятые конвейером, извлекаются и сообщаются.