2013-07-05 54 views
8

我的問題是基於another one,但我想做與此相反:告訴msbuild將警告視爲錯誤而不是抑制特定的msbuild警告。如何將MSB3245(無法解析引用)警告視爲錯誤?

但是,目前爲止我所看到的只有/p:WarningsAsErrors只能用於csc警告和錯誤。我嘗試着放棄MSB,並用Google搜索那些可能在那裏工作的號碼,但沒有運氣。

有沒有辦法將msbuild(命令行)中的「assembly reference not found」警告視爲錯誤?

回答

8

最近我需要類似的東西(對某些日誌事件起作用),但我找不到乾淨的解決方案,主要是因爲我沒有想出如何以編程方式訪問msbuild進程中的記錄器。我沒有想出這個雖然,適應你的問題的原則是:

  • 如果出現警告
  • 有安裝自定義記錄儀掃描警告
  • 構建
  • 設置一個靜態標誌自定義任務檢查標誌,如果它是在

初聽很難產生一個錯誤,但代碼很簡單:

using Microsoft.Build.Framework; 
using Microsoft.Build.Utilities; 

namespace Foo 
{ 
    public static class Common 
    { 
    public static bool errorsOccurred = false; 
    } 

    public class ScanLogger : Logger 
    { 
    public override void Initialize(IEventSource eventSource) 
    { 
     eventSource.MessageRaised += (s, e) => 
     Common.errorsOccurred |= e.Message.Contains("MSB3245"); 
    } 
    } 

    public class CheckErrors : Task 
    { 
    public override bool Execute() 
    { 
     if(Common.errorsOccurred == false) 
     return true; 
     Log.LogError("errorsOccurred = true"); 
     return false; 
    } 
    } 
} 

下面是使用它的樣本的MSBuild腳本:

<UsingTask TaskName="Foo.CheckErrors" AssemblyFile="Foo.dll"/> 

<Target Name="MyBuild"> 
    <Message Text="MSB3245"/> <!-- simulate the build warning --> 
    <Foo.CheckErrors /> <!-- this will trigger an error --> 
</Target> 

你調用它是這樣的:

msbuild /logger:Foo.dll my.proj 

編輯我只需要這一次卻找不到原始的dll文件,也不項目文件等 - 我想在git中存儲代碼和最簡單的構建指令,並在需要時動態構建它,可能更乾淨。再次嘗試這樣的:所以基本上在一些地方保存上面的代碼在一個文件customlogger.cs,然後在你的構建過程中,有效地調用的MSBuild使用自定義記錄之前,使用

<Target Name="BuildCustomLoggerDll"> 
    <Csc Sources="$(MSBuildThisFileDirectory)customlogger.cs" 
     References="System.dll;mscorlib.dll;Microsoft.Build.Framework.dll;Microsoft.Build.Utilities.v4.0.dll" 
     TargetType="Library" OutputAssembly="$(MSBuildThisFileDirectory)CustomLogger.dll"/> 
</Target> 

更新在迴應評論構建它今天我不確定原始代碼實際上是否曾經工作過(對於示例消息顯示而不是實際警告MSB3245),因爲它只鉤住消息事件,而ResolveAssemblyReference發出實際的警告事件,而且警告編號isn通常包含在消息中。這是卓有成效的,但:

public class ScanLogger : Logger 
{ 
    public override void Initialize(IEventSource eventSource) 
    { 
    eventSource.WarningRaised += (s, e) => Common.errorsOccurred |= e.Code == "MSB3245"; 
    } 
} 
+0

是有辦法增加這個過程到解決方案層面而不是項目層面? – Maslow

+0

基本上你會在一個公共文件中定義這個邏輯,然後在每個項目中導入該文件。不知道在解決方案的基礎上自動完成此操作的最佳方法,但是,像這樣的可能:http://stackoverflow.com/questions/18249027/import-targets-file-from-command-line-in-msbuild或http ://dotnet.geir-sorensen.net/2010/04/msbuild-custom-targets.html – stijn

+0

@stijn我正在使用此代碼,並得到它與您的示例(其中我人爲發送一條消息,其中包含MSB3245)的工作。但是,當我真正運行它時,沒有這樣的消息進來。我將(通過文件)記錄到此記錄器收到的每條消息,並且沒有有趣的消息進入(帶有警告等)。 我也嘗試掛鉤到eventSource.AnyEventRaised和eventSource.WarningRaised,但他們沒有我試圖找到的警告。它看起來行爲已經改變。 – fastmultiplication

1

看來,這不是一個警告,這個警告關聯的消息:如果您的代碼需要此引用

,則可能出現編譯 錯誤

,不太正確。如果缺少的引用是WPF主題,則會出現運行時間錯誤(System.IO。而不是FileNotFoundException)。

順便說一句,如果你特意去找MSB3245你會得到:

CSC:警告CS1691:「MSB3245」不是一個有效的警告編號

相關問題