2008-09-26 11 views
19

¿Alguien puede explicar qué ventajas hay al usar una herramienta como MSBuild (o NAnt) para compilar una colección de proyectos frente a ejecutar DevEnv.exe desde el comando- ¿línea?Ventajas de usar MSBuild o NAnt versus ejecutar DevEnv.exe desde la línea de comandos

Un colega con el que había trabajado en el pasado me había explicado que (al menos con versiones anteriores de Visual Studio) usando DevEnv.exe era mucho más lento que las otras técnicas, pero no he leído ninguna evidencia de eso o eso ahora es un punto discutible ahora que a partir de 2005, Visual Studio usa MSBuild bajo el capó.

Sé que una ventaja de usar MSBuild le permite construir sus proyectos sin requerir que Visual Studio esté instalado en las máquinas de compilación, pero no estaba seguro de si había otros.

Respuesta

16

Una razón es porque hay mucho más para construir un producto que simplemente compilarlo. Las tareas como crear instalaciones, actualizar números de versión, crear depósitos de garantía, distribuir los paquetes finales, etc. pueden ser mucho más fáciles debido a lo que proporcionan estas herramientas (y sus extensiones).

Si bien puede hacer todo esto con scripts normales, el uso de NAnt o MSBuild le proporciona un marco sólido para hacer todo esto. Hay mucho apoyo de la comunidad para ambos, incluidas las tareas adicionales que se pueden descargar (como el MSBuild Community Tasks Project). Además, hay soporte para ellos en numerosos productos de terceros y de código abierto.

Si solo está interesado en compilar (y no en todo el proceso de compilación), puede encontrar un beneficio de MSBuild que ahorra tiempo es el support for building with multiple processors.

2

La razón principal para usar una herramienta de compilación externa como NAnt o MsBuild es la capacidad de automatizar el proceso de compilación y, por lo tanto, proporcionar retroalimentación continua sobre el estado de su sistema. También se pueden usar para muchas cosas además de una compilación "pura" y es allí donde realmente comienzas a obtener valor de ellas, es algo extremadamente valioso poder construir y probar tu aplicación con un solo comando.

También puede comenzar a agregar cosas como la recopilación de métricas, el empaque de los archivos binarios de lanzamiento y todo tipo de cosas ingeniosas como esa.

+0

Gracias por la respuesta. Entiendo la ventaja de automatizar el proceso de compilación, creo que estaba buscando una distinción entre la automatización a través de herramientas como MSBuild o NAnt en lugar de llamar a DevEnv.exe desde un archivo por lotes o script. – afournier

0

Estamos experimentando con el cambio de DevEnv a una herramienta (Visual Build Pro) que usa MsBuild bajo el capó y obtuvimos el error "Referencia requerida para ensamblar 'System.Drawing ..." para un proyecto que no lo hace lo necesita y que funciona bien en Visual Studio.

6

La respuesta obvia de mi equipo es que no todos han instalado Visual Studio, en particular, no instalamos Visual Studio en nuestros servidores de compilación/CI.

+2

¿Por qué no en el servidor de compilación? Parece extraño que tu compilación use un mecanismo diferente al que están usando tus desarrolladores. Las soluciones de Visual Studio controlan las dependencias del proyecto y usted debe mantenerlas manualmente en su servidor de compilación, abriendo la posibilidad de que su compilación de producción sea diferente. –

+2

Puede construir un archivo .sln con MSBuild ... – Schneider

+8

NO instalar VS200x lo obliga a saber que realmente necesita producir un producto desplegable. Si tiene productos de terceros instalados en un cuadro de desarrollo, es posible que funcionen para una versión de desarrollador. Pero si lo coloca en una máquina que SÓLO tiene msbuild, sabrá antes (en lugar de más tarde) que le falta (y por lo tanto tendrá que distribuir) algunos ThirdParty.dll. Aka, se necesita algo de vudú. Nuestra máquina de construcción (CCNET) NO tiene permitido tener VS200x en ella. Por lo tanto, cuando creamos .zip o .msi se implementa, sabemos exactamente qué se debe incluir. De lo contrario, estás adivinando. – granadaCoder

2

En lo que se refiere a C#, devenv.exe 2005 ejecuta el compilador in-proc, lo que puede causar excepciones de falta de memoria para soluciones considerables. Msbuild recurre al lanzamiento del proceso csc.exe para cada proyecto. Los proyectos que no compilan con devenv/build funcionan bien con msbuild. Espero que te guste este motivo.

0

Tenemos un gran sistema que consiste en C#, C++ administrado y ensamblajes C++ simples no administrados y antiguos. Hay un código de C++ que depende del código de C++ administrado que depende del código de C# que depende del código de C++ administrado que depende del código antiguo de C++ (¡oh!). Cuando estábamos configurando nuestro entorno de compilación automatizado hace unos años, descubrimos que MSBuild.exe no manejaba correctamente todas las dependencias que tenemos.

Al trabajar con Microsoft pudimos resolver algunos de los problemas, pero no todos. Si mi memoria me sirve, nunca podríamos obtener ensamblajes de C# que dependieran de dlls administrados de C++ para construir.Así que terminamos creando un script de compilación personalizado que llamó devenv.exe desde la línea de comandos y funcionó bien.

Por supuesto, eso fue con VS2005, podría ser corregido ahora, pero la secuencia de comandos todavía funciona, por lo que no hemos vuelto a visitar el tema.

+0

Tenemos el mismo problema con respecto a las dependencias, incluso con una solución pura nativa/C++. Construir con MSBuild solo funciona de manera confiable cuando se hace una reconstrucción completa; al realizar construcciones incrementales, algunas dependencias de proyectos no se respetan, dependiendo de qué archivos se cambiaron. Probablemente tendremos que recurrir al uso de devenv.exe dentro de un script también. – lesscode

Cuestiones relacionadas