Visual Studio-ポストビルドイベント - スローエラー
-
02-10-2019 - |
質問
私は、ソリューションのマスタープロジェクトで依存関係をコンパイルして整理した後、すべてのプラグインを正しい場所に引き込むためのマジックマンボジャンボを行うためのマジックマンボジャンボを行う素敵なパワーシェル駆動型のポストビルドスクリプトを持っています。
私の問題は、時には愚かなことをするとき、私のスクリプトが正しく操作を実行できない状態になり、PowerShellの例外をスローすることができます。
これらの例外を取得してVisual Studioエラーウィンドウに引き上げる方法はありますか。これにより、私のポストビルドが失敗したときにVSTUDIOが失敗通知を取得し、他のすべての警告/エラーと一緒にウィンドウでうまくフォーマットしますか?
編集:これは、私が理想的に探しているものの説明です。
Dead Imageshackリンクを削除しました
ノート: あなたがここに着地し、カスタムエラーメッセージをVisual Studioに表示する方法を探していた場合(エラーメッセージを制御するとき)、表示できます ロイ・ティンカーの答え メッセージを調整して表示する方法を学ぶために。予期しないエラーをキャッチすることに興味がある場合、または制御できない場合、またはより完全な解決策を見つけることができない場合は、受け入れられている答えをご覧ください。
解決
PowerShellスクリプトエラーが発生したときにビルドを中断するための2つのアプローチを次に示します。
使用する exit()
PowerShellプロセスを終了します
ゼロ以外の場合、エラーリストに表示されるスクリプトからステータスコードを返すには、以下を使用します。
exit(45) # or any other non-zero number, for that matter.
これにより、エラーテキストがエラーリストに正確に届きませんが、スクリプトを終了し、エラーリストに少し何かを取得して、ビルド前または後のコマンドが失敗したことを示します。
カスタムMSBuildタスクを使用して、PowerShellスクリプトを実行する
MSBUILDタスク内でPowerShellスクリプトを実行する詳細を簡単に解決するのに少し時間を費やしました。私は持っています 私のブログにサンプルコードを含む完全な記事. 。より多くの議論と、サンプルプロジェクトの処理方法についてのいくつかの説明が含まれているため、チェックしてください。おそらく完全なソリューションでも完璧なソリューションでもありませんが、マシンで動作しましたTM 非常にシンプルなスクリプトで。
このアプローチは、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スクリプトへのパスを指定します。
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
エラーを記録するプロパティ。終了したら、Runspaceを閉じて、スクリプトがエラーを記録しなかった場合に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>
soのような.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へのメッセージをログに記録するだけです。公式の仕様がある場合は、コメントまたは編集してください。これは、私が試用版とエラーによって、そして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でビルドを実行したときに発生する可能性のあるエラー/警告/メッセージについては、出力ウィンドウを参照してください。