簡體   English   中英

是否可以在項目文件中指定MSBuild自定義記錄器?

[英]Can a MSBuild custom Logger be specified within a Project file?

msbuild有一個命令行參數'/ logger',允許您在構建時指定自定義實現的記錄器。 https://msdn.microsoft.com/zh-cn/library/ms171471.aspx

msbuild.exe /?

...

/ logger:使用此記錄器記錄來自MSBuild的事件。 要指定多個記錄器,請分別指定每個記錄器。 語法為:[,] [;]語法為:[。]語法為:{[,] | }是可選的,並且會按照您鍵入的內容完全傳遞給記錄器。 (簡短格式:/ l)示例:/ logger:XMLLogger,MyLogger,Version = 1.0.2,Culture = neutral /logger:XMLLogger,C:\\Loggers\\MyLogger.dll;OutputAsHTML

我想實現自己的自定義記錄器。 確保我的開發團隊的其余成員在每次構建時都與之一起運行; 我想直接在項目文件本身中應用某種設置。

理想情況下,這意味着如果有人通過IDE,msbuild命令行和/或使用devenv命令行構建了項目,則將始終運行自定義記錄器。

在項目文件中可以使用什么設置,屬性或其他機制來設置自定義記錄器?

答案是不。 記錄器是構建引擎的配置設置。 您無法啟動構建,然后配置構建引擎。 這是MSDN的代碼片段-它顯示了構建引擎初始化的正常流程:

// Instantiate a new Engine object
Engine engine = new Engine();

...

// Instantiate a new FileLogger to generate build log
FileLogger logger = new FileLogger();
// Register the logger with the engine
engine.RegisterLogger(logger);

// Build a project file
bool success = engine.BuildProjectFile(@"c:\temp\validate.proj");

//Unregister all loggers to close the log file
engine.UnregisterAllLoggers();

可能會有破解方法,因為每個MSBuild任務都會收到對構建引擎對象(IBuildEngine接口)的引用,您可以將其類型轉換為Microsoft.BuildEngine.Engine並調用RegisterLogger方法。 但是請注意,這將是錯誤的,因為您將為構建中的所有項目全局修改引擎,並且該引擎可能無法正常工作或隨時停止工作。

正如ST所說:沒有真正正確的方法可以做到這一點。 但是,通過一個相當簡單的技巧(即覆蓋Build目標),您可以實現所需的功能。 不知道我是否會推薦它,覆蓋這樣的目標可能會破壞構建。

無論如何。 我不喜歡將程序集存儲在版本控制中,因此讓我們從自定義記錄器的源代碼開始,將其放入CustomLogger.cs文件中。 自定義記錄器將是即時生成的-但是,如果您當然願意,可以跳過此步驟並直接使用程序集:

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

namespace CustomLogger
{
  public class ScanLogger : Logger
  {
    public override void Initialize( IEventSource eventSource )
    {
      eventSource.MessageRaised += ( s, e ) =>
        System.Console.WriteLine( "HI THERE - " + e.Message );
    }
  }
}

然后在項目文件中將其添加到導入Microsoft.CSharp.targets的行之后

<PropertyGroup>
  <LoggerDll>Customlogger.dll</LoggerDll>
</PropertyGroup>

<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)$(LoggerDll)"/>
</Target>

<Target Name="ActualBuild"
        Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
        DependsOnTargets="$(BuildDependsOn)"
        Returns="$(TargetPath)"/>

<Target Name="Build">
  <Exec Command="C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe $(MSBuildThisFile) /t:ActualBuild /noconsolelogger /l:$(MSBuildThisFileDirectory)$(LoggerDll)"/>
</Target>

在VS中或未指定目標的情況下在命令行上Build將調用默認目標Build 這通常會生成,但是在這里我們將其覆蓋並使其做更多有趣的事情:它將首先通過BuildCustomLoggerDll構建您的自定義記錄器dll,然后通過Exec任務手動調用msbuild,並指定使用所選的自定義記錄器。 構建的目標是ActualBuild ,這是在C:\\Program Files (x86)\\MSBuild\\12.0\\Bin\\Microsoft.Common.CurrentVersion.targets找到的原始Build目標的副本-因此,此示例適用於VS2013和C#項目以及可能需要對其他版本和其他語言進行修改。 但它可以工作,並通過自定義記錄器進行記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM