は番号が含まれてMSBuildのスクリプトがある場合、DelphiおよびC#プロジェクト、ユニットテストなどMSBuild:警告の数を取得する方法?
問題がある:どのようにビルドをマークするために、警告が提起された場合には失敗した(テスト目的のためではなく、リリースビルド用)?カスタムタスクでLogWarningの代わりにLogErrorを使用すると良い選択肢ではないようです。なぜならビルドは可能な限り多くの警告を報告できるように(実際のエラーまで)テストする必要があるからです(ビルドプロジェクトはCruiseControl.NET )。
解決策は、内部に警告フラグを格納する独自のロガーを作成することですが、ビルドの最後にこのフラグを読み取る方法があるかどうかはわかりません。
P.S. Delphiコンパイラの出力はカスタムタスクで処理され、/ warnaserrorはC#で使用できますが、望ましい動作は "すべてビルド、すべての警告を収集する"、 "ビルドに失敗する"最初の警告だけでなく、すべての警告について報告します。
P.P.S.私が警告の数を本当に必要とするのではなく、その存在のフラグだけで、私はシグナリングメカニズムを単純化し、共有メモリの代わりに些細なMutexを使うことに決めました。コードは以下の通りです:
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System.Threading;
namespace Intrahealth.Build.WarningLogger
{
public sealed class WarningLoggerCheck : Task
{
public override bool Execute()
{
Log.LogMessage("WarningLoggerCheck:" + mutexName + "...");
result = false;
Mutex m = null;
try
{
m = Mutex.OpenExisting(mutexName);
}
catch (WaitHandleCannotBeOpenedException)
{
result = true;
}
catch (Exception)
{
}
if (result)
Log.LogMessage("WarningLoggerCheck PASSED");
else
Log.LogError("Build log contains warnings. Build is FAILED");
return result;
}
private bool result = true;
[Output]
public bool Result
{
get { return result; }
}
private string mutexName = "WarningLoggerMutex";
public string MutexName
{
get { return mutexName; }
set { mutexName = value ?? "WarningLoggerMutex"; }
}
}
public class WarningLogger : Logger
{
internal static int warningsCount = 0;
private string mutexName = String.Empty;
private Mutex mutex = null;
public override void Initialize(IEventSource eventSource)
{
eventSource.WarningRaised += new BuildWarningEventHandler(eventSource_WarningRaised);
}
private void SetMutex()
{
if (mutexName == String.Empty)
{
mutexName = "WarningLoggerMutex";
if (this.Parameters != null && this.Parameters != String.Empty)
{
mutexName = this.Parameters;
}
}
mutex = new Mutex(false, mutexName);
}
void eventSource_WarningRaised(object sender, BuildWarningEventArgs e)
{
if (e.Message != null && e.Message.Contains("MSB3146"))
return;
if (e.Code != null && e.Code.Equals("MSB3146"))
return;
if (warningsCount == 0)
SetMutex();
warningsCount++;
}
}
}
ほとんど同じことを使用しようとしましたが、タスクサブクラスの静的メンバーを使用して警告数を収集しました(動作しませんでした)。共有メモリに関するアイディアをありがとう。 – Abelevich