[英]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.