2010-12-02 13 views
9

Nuestros scripts de MSBuild utilizan la tarea Exec para llamar a algunas aplicaciones de línea de comandos. La mayoría de estas aplicaciones tienen su propia configuración de verbosidad de salida que me gustaría que fuera igual al nivel de detalle del script MSBuild llamándolos.Obtenga el nivel de verbosidad de registro actual en mi secuencia de comandos de MSBuild

¿Hay alguna forma de obtener el nivel de detalle de registro de mi proceso de MSBuild?

Pensé que podría escribir una tarea personalizada para manejar esto, pero hurgando alrededor de la API de MSBuild, no pude encontrar ninguna propiedad o clase que me diera el nivel de detalle.

Respuesta

10

Poco después de preguntar a mis preguntas, me di cuenta de que MSBuild 4 expone System.Environment.CommandLine como una función de propiedad, que debe incluir los argumentos de verbosidad. Con el siguiente segmento de análisis, se pueden crear varias propiedades booleanas que le dirá el nivel de registro actual:

<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> 

Recuerde, esto sólo funcionará en MSBuild 4+.

Ugly? Sip. Kludgy? Tal vez. Funciona. ¡Sip!

+0

Esto no funciona desde el IDE de Visual Studio, ya que parece que msbuild consulta información del IDE mediante la comunicación entre procesos en lugar de algo tan mundano y confiable como un parámetro de línea de comando. – jstine

Cuestiones relacionadas