有一個MSBuild腳本,其中包括數字,如果德爾福和C#項目,單元測試等MSBuild:如何獲取引發警告的次數?
問題是:如何標記構建失敗,如果警告提出(測試目的,而不是發佈版本)?在自定義任務中使用LogError而不是LogWarning似乎不是一個好的選擇,因爲構建應儘可能多地進行測試(直到真正的錯誤)才能在一段時間內報告儘可能多的警告(構建項目在CruiseControl.NET中使用)。
可能是,解決方案是創建我自己的記錄器,將存儲警告標誌裏面,但我不能找到在構建結束時是否有讀取此標誌的方法?
P.S.在收到警告(Delphi編譯器輸出由自定義任務處理,並且/ warnaserror可用於C#)時立即失敗構建沒有問題,但期望的行爲是「構建一切;收集所有警告;構建失敗」報告所有警告,不僅是關於第一個。
P.P.S.至於我真的不需要警告的數量,但只是他們存在的標誌,我決定簡化信號機制,並使用普通的互斥而不是共享內存。代碼如下:
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++;
}
}
}
抱歉,該任務是收集所有的警告(或者,至少,作爲儘可能多,直到真正的錯誤),然後將構建標記爲失敗。等待CruiseControl構建並不方便;接收關於第一警告的消息;解決問題並等待下一個問題。 – Abelevich 2008-09-30 10:41:29
反正誰想知道:Delphi 2009有一個對待所有警告的錯誤 – 2008-09-30 11:34:26
對不起,沒想到CC.NET放棄了第一個錯誤之後。 – 2008-09-30 12:14:20