2010-12-02 3 views
9

В наших сценариях MSBuild используется задача Exec для вызова нескольких приложений командной строки. Большинство из этих приложений имеют свои собственные параметры verbosity вывода, которые я хотел бы быть такими же, как уровень многословности сценария MSBuild, вызывающий их.Получить текущий уровень детализации ведения журнала в моем сценарии MSBuild

Есть ли способ получить уровень детализации ведения журнала моего MSBuild?

Я думал, что могу написать настраиваемую задачу, чтобы справиться с этим, но, судя по API MSBuild, я не мог найти никаких свойств или классов, которые бы дали мне уровень детализации.

ответ

10

Вскоре после того, как я задал свои вопросы, я заметил, что MSBuild 4 предоставляет функцию System.Environment.CommandLine как функцию свойства, которая должна включать в себя любые аргументы аргумента. При следующем немного синтаксического анализа, вы можете создать несколько логических свойств, которые расскажут вам текущий уровень протоколирования:

<PropertyGroup> 
    <CommandLine>$([System.Environment]::CommandLine.Trim().ToLower())</CommandLine> 
    <IsQuietVerbosity>False</IsQuietVerbosity> 
    <IsMinimalVerbosity>False</IsMinimalVerbosity> 
    <IsNormalVerbosity>True</IsNormalVerbosity> 
    <IsDetailedVerbosity>False</IsDetailedVerbosity> 
    <IsDiagnosticVerbosity>False</IsDiagnosticVerbosity> 
</PropertyGroup> 

<PropertyGroup Condition="'$(CommandLine.Contains(&quot;/v&quot;))' == 'True'"> 
    <IndexOfLastVerbosityArg>$(CommandLine.LastIndexOf("/v"))</IndexOfLastVerbosityArg> 
    <IndexOfVerbosityArg>$(CommandLine.IndexOf(":", $(IndexOfLastVerbosityArg)))</IndexOfVerbosityArg> 
    <IndexOfVerbosityArg>$([MSBuild]::Add($(IndexOfVerbosityArg), 1))</IndexOfVerbosityArg> 
    <IndexOfEndOfVerbosityArg>$(CommandLine.IndexOf(" ", $(IndexOfVerbosityArg)))</IndexOfEndOfVerbosityArg> 
    <IndexOfEndOfVerbosityArg Condition="'$(IndexOfEndOfVerbosityArg)' == '-1'">$(CommandLine.Length)</IndexOfEndOfVerbosityArg> 
    <LengthOfVerbosityArg>$([MSBuild]::Subtract($(IndexOfEndOfVerbosityArg), $(IndexOfVerbosityArg)))</LengthOfVerbosityArg> 
    <VerbosityLevel>$(CommandLine.Substring($(IndexOfVerbosityArg), $(LengthOfVerbosityArg)).Trim())</VerbosityLevel> 
    <IsQuietVerbosity>$(VerbosityLevel.StartsWith('q'))</IsQuietVerbosity> 
    <IsMinimalVerbosity>$(VerbosityLevel.StartsWith('m'))</IsMinimalVerbosity> 
    <IsNormalVerbosity>$(VerbosityLevel.StartsWith('n'))</IsNormalVerbosity> 
    <IsDiagnosticVerbosity>$(VerbosityLevel.StartsWith('di'))</IsDiagnosticVerbosity> 
    <IsDetailedVerbosity Condition="'$(IsDiagnosticVerbosity)' == 'False'">$(VerbosityLevel.StartsWith('d'))</IsDetailedVerbosity> 
</PropertyGroup> 

Помните, что это будет работать только в MSBuild 4+.

Ugly? Ага. Запутано? Может быть. Это работает. Ага!

+0

Это не работает с IDE Visual Studio, поскольку msbuild, как представляется, запрашивает информацию из среды IDE, используя связь между процессами, а не что-то как обычное и надежное в качестве параметра командной строки. – jstine 2018-01-04 16:24:26

Смежные вопросы