specify prod net dotnet cli argumentos .net powershell msbuild

.net - prod - msbuild reduce verbosity



¿Cómo ejecutar MSBuild desde Powershell sin generar el proceso msbuild.exe? (5)

Estoy considerando ejecutar MSBuild desde una secuencia de comandos de Powershell tocando directamente en los ensamblados de MSBuild (en lugar de buscar la ruta de instalación de MSBuild e iniciar msbuild.exe como un proceso secundario).

¿Alguien ha hecho esto? ¿Cuál sería la forma más simple y directa de ejecutar la compilación? ¿Hay algún pros / contra para cualquiera de las técnicas que te gustaría señalar? (Estoy especialmente interesado en cualquier problema que pueda surgir al ejecutar msbuild en el mismo proceso / appdomain que el resto del script).

Actualmente mi pensamiento es algo así:

[void][System.Reflection.Assembly]::Load(''Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'') [void][Microsoft.Build.BuildEngine.Engine]::GlobalEngine.BuildProjectFile("path/main.proj")


Estaba buscando lo mismo. Siguiendo el ejemplo de JaredPar, encontré lo siguiente:

Este es un procedimiento para hacer un cmdlet.

http://bartdesmet.net/blogs/bart/archive/2008/02/03/easy-windows-powershell-cmdlet-development-and-debugging.aspx

La API de MSBuild es parte de estos espacios de nombres:

Microsoft.Build.Framework Microsoft.Build.BuildEngine

Y la documentación de MSBuild se puede encontrar aquí (esto es más por completitud que en respuesta a su pregunta):

http://msdn.microsoft.com/en-us/library/wea2sca5.aspx


La invocación de construcción integrada más simple que trabajó y produjo el resultado fue:

[void][System.Reflection.Assembly]::Load(''Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'') $engine = New-Object Microsoft.Build.BuildEngine.Engine $engine.RegisterLogger((New-Object Microsoft.Build.BuildEngine.ConsoleLogger)) $engine.BuildProjectFile(''fullPath/some.proj'')

Sin embargo, resulta incómodo incrustar MSBuild directamente en Powershell (V1):

''MSBUILD : warning MSB4056: The MSBuild engine must be called on a single-threaded-apartment. Current threading model is "MTA". Proceeding, but some tasks may not function correctly.''

¿Por qué, por qué seguimos pagando impuestos COM en 2009 mientras trabajamos en un entorno administrado?

Mi conclusión es que incrustar MSBuild en Powershell (V1) no es una buena idea. Como referencia, también incluyo el enfoque basado en procesos que terminé usando:

[void][System.Reflection.Assembly]::Load(''Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'') $msbuild = [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFrameworkFile("msbuild.exe", "VersionLatest") &$msbuild fullPath/some.proj


Un enfoque diferente y potencialmente más útil sería crear un cmdlet de msbuild. MsBuild tiene una buena API y hay muchas muestras sobre cómo usarlo desde un lenguaje compilado como C # / VB. Sería muy fácil crear un cmdlet que proporcione una sintaxis mucho más agradable a sus scripts de PowerShell.


Yo recomendaría mirar PSake .

Permítanme citar una porción de esa página:

Recuerde que psake es azúcar sintáctico alrededor de PowerShell. Entonces, cualquier cosa que pueda hacer en PowerShell, puede hacerlo en psake. Eso significa que puede ejecutar MSBuild, NAnt u otros scripts. No hay necesidad de reemplazar completamente su sistema de compilación actual. ¡Puedes usar psake para automatizarlo y ampliarlo!

psake agrega automáticamente la versión apropiada de .NET Framework a su ruta. Para que pueda acceder a MSBuild, csc.exe, vbc.exe o cualquier otra herramienta instalada en $ env: windir / Microsoft.NET / Framework / $ version / sin la ruta completa.


Érase una vez que he estado jugando con ejecutar los procesos de compilación de MSBuild aumentados (como omitir algunas partes de la compilación de forma más agresiva).

Había dos opciones:

  1. Aloje MSBuild en su propio proceso cargando sus archivos DLL.
  2. Spawn MSBuild.exe de la manera habitual y luego inyectar en él (por ejemplo, los registradores proporcionan una manera decente).

Implementé ambos y tuve que abandonar el # 1 porque no era lo suficientemente flexible.

Por ejemplo, MSBuild tiene una carga de redirecciones de enlace de ensamblaje en su archivo .config.

El proceso de Visual Studio ( devenv.exe ) que también aloja MSBuild con su API termina copiándolos en su devenv.exe.config . Mine .exe.config también tenía que tener estos, pero te adhiere a una versión específica de MSBuild. Y, por supuesto, tienes que modificar la configuración. Lo cual no es una opción con la PS en realidad, así que dudo que pueda obtener una solución realmente estable.