¿Cuáles son las ventajas de los scripts de compilación?

97

Durante la mayor parte de mi carrera de programación, he usado el comando "compilar / compilar / ejecutar" en cualquier IDE con el que estoy trabajando para producir un programa ejecutable. Este es un botón, bastante fácil. Sin embargo, a medida que aprendo más sobre diferentes lenguajes y marcos, veo más y más charlas sobre "compilar scripts" (ANT, Maven, Gradle, etc.) para poner en marcha un proyecto. Según tengo entendido, son instrucciones para el compilador / enlazador / creador de programas mágicos que especifican detalles de configuración: minucias.

Recuerdo haber escrito makefiles en la escuela, pero no vi ninguna ventaja especial en ese momento (solo los usábamos cuando escribíamos en un terminal Unix, donde no había un IDE con su práctico botón "build"). Más allá de eso, he visto otras preguntas aquí que discuten cómo los scripts de compilación pueden hacer más que solo crear su programa: pueden ejecutar pruebas unitarias y recursos seguros independientemente de la máquina host .

No puedo evitar la sensación de que los scripts de compilación son importantes de entender como desarrollador, pero me gustaría una explicación significativa; ¿Por qué debería usar / escribir scripts de compilación?

Las responsabilidades de Build Script y Build Server discuten el papel que desempeña dentro de un alcance más amplio. Estoy buscando las ventajas específicas que ofrece un script de compilación frente al comando "compilar / ejecutar" de un IDE o métodos similares similares.

WannabeCoder
fuente
18
Las respuestas aquí han cubierto todo bastante bien, pero quería mencionar el hecho de que cuando hace clic en el botón "Ejecutar" en su IDE, (casi invariablemente) ejecuta un script de compilación que generó su IDE. escribir su propio script de compilación solo le da más control sobre el proceso.
Woodrow Barlow
66
escribir y compartir su propio script de compilación también significa que cualquiera puede compilarlo con un proceso idéntico al de su proceso, incluso si la otra persona usa un IDE diferente. Esto ayuda con la consistencia.
Woodrow Barlow
1
Los scripts de construcción son a menudo important to understand as a developer, aunque ciertamente no siempre Incluso en entornos donde los scripts de compilación son requisitos prácticos, muchos "desarrolladores" no se preocuparán por ellos en lo más mínimo. Pero los scripts son importantes para los 'constructores' más que para los desarrolladores. En los últimos lugares donde trabajé, la mayoría de los desarrolladores prácticamente no tenían conexión para crear scripts.
user2338816
3
no todos usan IDE con el botón "construir"
Vladimir Starkov

Respuestas:

113

Automatización.

Cuando esté desarrollando, solo en los proyectos más simples el botón de "compilación" predeterminado hará todo lo que necesita hacer; Es posible que necesite crear WS a partir de API, generar documentos, vincularse con recursos externos, implementar los cambios en un servidor, etc. Algunos IDE le permiten personalizar el proceso de compilación agregando pasos o constructores adicionales, pero eso solo significa que usted es generar su script de compilación a través de los productos IDE.

Pero desarrollar un sistema no es solo escribir código. Hay múltiples pasos involucrados. Un script independiente de IDE se puede ejecutar automáticamente, lo que significa que:

  • Cuando confirma un cambio en el control de versiones, el servidor puede iniciar automáticamente una nueva compilación. Se asegurará de que no se haya olvidado de comprometer todo lo necesario para la compilación.

  • Del mismo modo, después de que se realiza la compilación, las pruebas se pueden ejecutar automáticamente para ver si rompió algo.

  • Ahora el resto de la organización (QA, sysadmins) ha creado un producto que

    a) es perfectamente reproducible solo desde la versión de control.

    b) es común a todos ellos.

Incluso cuando he estado trabajando como un equipo de un solo hombre, he usado guiones para ese propósito; cuando había desarrollado la solución, me comprometería con SVN, exportaba el SVN nuevamente en otro directorio y usaba el script de compilación para generar la solución, que luego iría a los sistemas de Preproducción y luego a Producción. Si algunas semanas después (con mi base de código local ya cambiada) alguien se quejó de un error, sabría exactamente qué revisión de SVN tendría que verificar para depurar correctamente el sistema.

SJuan76
fuente
44
Esta es la mejor respuesta en mi humilde opinión. Todos tienen razón con su idea, pero esta realmente muestra por qué quieres construir scripts. Debido a que admiten la automatización que avanza a medida que el proyecto se expande, le ahorrará toneladas de tiempo.
Alexus
16
@Alexus No solo el tiempo, sino también los errores tontos. ;) "La repetición conduce al aburrimiento. El aburrimiento conduce a errores horripilantes. Los errores horripilantes conducen a 'Ojalá todavía estuviera aburrido'. "(También podría medir errores tontos a tiempo, pero es importante darse cuenta de que le está ahorrando tiempo por varias causas)
Jpmc26
@ jpmc26 estando allí - hecho eso: D
Alexus
2
Incluso para proyectos individuales, puede ser útil ejecutar un servidor Jenkins local para automatizar la "compilación en un directorio separado". Estoy trabajando en algo en Windows que necesito confirmar también compilaciones cruzadas, por lo que tener Jenkins compila y ejecuta pruebas, luego compila la versión compilada cruzada me hace mucho más seguro (y eficiente, por supuesto) cuando necesito liberar correcciones de errores.
Ken YN
44
@ JonasGröger Automation saca una de las mayores variables: los humanos.
CurtisHx
34

Al igual que el código, la computadora ejecuta un script de compilación. Las computadoras son excepcionalmente buenas para seguir un conjunto de instrucciones. De hecho, (fuera del código de auto-modificación), las computadoras ejecutarán la misma secuencia de instrucciones exactamente de la misma manera, dada la misma entrada. Esto ofrece un nivel de consistencia que, bueno, solo una computadora puede igualar.

Por el contrario, las bolsas de carne llenas de agua son simplemente despreciables cuando se trata de seguir los pasos. Ese molesto cerebro analítico tiene una tendencia a cuestionar todo lo que encuentra. "Oh ... no necesito eso", o "¿Realmente debo usar esta bandera? Eh ... simplemente la ignoraré". Además, tenemos una tendencia a ser complacientes. Una vez que hayamos hecho algo varias veces, comenzamos a creer que conocemos las instrucciones y no tenemos que mirar la hoja de instrucciones.

De "El programador pragmático":

Además, queremos garantizar la coherencia y la repetibilidad del proyecto. Los procedimientos manuales dejan consistencia al cambio; la repetibilidad no está garantizada, especialmente si los aspectos del procedimiento están abiertos a la interpretación de diferentes personas.

Además, HILARAMENTE somos lentos en la ejecución de instrucciones (en comparación con una computadora). En un proyecto grande, con cientos de archivos y configuraciones, llevaría años ejecutar manualmente todos los pasos en un proceso de compilación.

Te daré un ejemplo del mundo real. Estaba trabajando en un software integrado, donde la mayor parte del código se compartía en algunas plataformas de hardware diferentes. Cada plataforma tenía un hardware diferente, pero la mayoría del software era el mismo. Pero había pequeñas piezas que eran específicas de cada hardware. Idealmente, las piezas comunes se colocarían en una biblioteca y se vincularían en cada versión. Sin embargo, las piezas comunes no se pueden compilar en una biblioteca compartida. Tenía que ser compilado con cada configuración diferente.

Al principio, compilé manualmente cada configuración. Solo tomó unos segundos para cambiar entre configuraciones, y no fue tan difícil. Hacia el final del proyecto, se descubrió un defecto crítico en la parte compartida del código, donde un dispositivo esencialmente se haría cargo del bus de comunicación. Esto fue malo! Muy mal. Encontré el error en el código, lo arreglé y volví a compilar cada versión. Excepto uno. Durante el proceso de construcción, me distraje y olvidé uno. Los binarios fueron liberados, la máquina fue construida, y un día después recibí una llamada telefónica diciendo que la máquina dejó de responder. Lo revisé y descubrí que un dispositivo había bloqueado el autobús. "¡Pero arreglé ese error!".

Puede que lo haya arreglado, pero nunca llegó a esa placa. ¿Por qué? Porque no tenía un proceso de compilación automatizado que construyera cada versión con 1 clic.

CurtisHx
fuente
2
¡Y puedes ir a tomar un café mientras se ejecuta el script de compilación!
Peter Mortensen
15

Si todo lo que quiere hacer es <compiler> **/*.<extension>construir scripts, tiene poco propósito (aunque uno puede argumentar que si ve un Makefileproyecto en el que sabe que puede construirlo make). La cuestión es que los proyectos no triviales generalmente requieren más que eso, por lo menos, generalmente necesitará agregar bibliotecas y (a medida que el proyecto madure) configurar los parámetros de compilación.

Los IDE suelen ser al menos tan configurables, pero ahora el proceso de compilación se basa en opciones específicas de IDE. Si está utilizando Eclipse , Alice prefiere NetBeans , y Bob quiere usar IntelliJ IDEA , no puede compartir la configuración, y cuando uno de ustedes empuja un cambio al control de origen, necesitan editar manualmente la configuración creada por IDE archivos de los otros desarrolladores, o notifique a los otros desarrolladores para que lo hagan ellos mismos (lo que significa que habrá confirmaciones donde la configuración de IDE es incorrecta para algunos de los IDE ...).

También debe descubrir cómo hacer ese cambio en todos y cada uno de los IDE utilizados por el equipo, y si uno de ellos no es compatible con esa configuración en particular ...

Ahora, este problema depende de la cultura: sus desarrolladores pueden encontrar aceptable no tener la opción de IDE. Pero los desarrolladores que tienen experiencia con un IDE generalmente son más felices y más eficientes cuando lo usan, y los usuarios de editores de texto tienden a ser fanáticos de sus herramientas favoritas, por lo que este es uno de los lugares donde desea dar libertad a los desarrolladores - y los sistemas de construcción te permiten hacer exactamente eso. Algunas personas pueden tener una preferencia de sistema de compilación, pero no es tan fanático como las preferencias de IDE / editor ...

Incluso si logra que todos los desarrolladores usen el mismo IDE, buena suerte convenciendo al servidor de compilación para que lo use ...

Ahora, eso es para las personalizaciones simples del proceso de construcción, para las que los IDE tienden a proporcionar una GUI agradable. Si desea cosas más complejas, como preprocesar / generar automáticamente archivos fuente antes de la compilación, generalmente tendrá que escribir un script de precompilación en un área de texto básica dentro de la configuración del IDE. En qué sistemas de compilación aún tendría que codificar esa parte, pero puede hacerlo en el editor real en el que escribe el código y, lo que es más importante: el marco del sistema de compilación en sí mismo generalmente proporciona algún soporte para organizar estos scripts.

Finalmente, los sistemas de compilación son buenos para algo más que construir el proyecto: puede programarlos para realizar otras tareas que todos los miembros del equipo podrían necesitar realizar. En Ruby on Rails , por ejemplo, hay tareas del sistema de compilación para ejecutar migraciones de bases de datos, para limpiar los archivos temporales, etc. Al poner estas tareas en el sistema de compilación se garantiza que todos los miembros del equipo puedan realizarlas de manera consistente.

Idan Arye
fuente
2
No se trata solo de diferentes IDEs. Algunos desarrolladores odian y detestan los IDE de todo tipo.
David Hammen
2
@DavidHammen Soy uno de estos desarrolladores (aunque he configurado mi Vim tan duro que es posible que lo haya convertido en un IDE ...), y mientras escribía ese párrafo estaba escribiendo automáticamente "editores" y tuve que arreglarlo en IDE, porque creo que el accesorio en IDE es una parte importante de mi respuesta. El autor de la pregunta claramente proviene del mundo IDE, y la pregunta habla sobre el desarrollo sin IDE como algo que se ve obligado a hacer cuando no hay un IDE adecuado disponible. El objetivo de esta respuesta es mostrar cómo los sistemas de compilación son beneficiosos incluso para equipos compuestos exclusivamente por usuarios de IDE.
Idan Arye
Yo también soy uno de esos desarrolladores. No quiero que mis dedos tengan que abandonar el teclado. Hacerlo interrumpe mis procesos de pensamiento.
David Hammen
1
Estoy en desacuerdo. Prefiero IDEs. Me permiten no preocuparme por los nombres, búsquedas fáciles, refactorización, buena interfaz de usuario. Quiero decir, si un IDE puede hacer algo por mí que de otro modo haría con sed ack, etc., lo uso.
ps95
El punto es que con los scripts de compilación, cada desarrollador del equipo puede usar lo que prefiera, mientras que con la funcionalidad de compilación del IDE está obligando a todos no solo a usar un IDE, sino a usar el IDE muy específico para el que está configurado el proyecto (a menos que usted configurarlo para múltiples IDEs, y buena suerte sincronizando eso ...)
Idan Arye
13

¡Muchos IDEs simplemente empaquetan los comandos utilizados para construir algo y luego generan un script y lo llaman!

Por ejemplo, en Visual Studio, puede ver los parámetros de la línea de comandos para una compilación de C ++ en el cuadro 'línea de comandos'. Si observa detenidamente el resultado de la compilación, verá el archivo temporal que contiene el script de compilación que se utilizó para ejecutar la compilación.

Hoy en día, todo es MSBuild , pero el IDE todavía lo ejecuta directamente.

Entonces, la razón por la que usa la línea de comando es que va directamente a la fuente y omite al intermediario, un intermediario que podría haberse actualizado o requerir un montón de dependencias que simplemente no desea o necesita en un servidor sin cabeza que actúa como su servidor de integración continua (CI).

Además, sus scripts hacen más que los pasos habituales orientados al desarrollador para los que están diseñados. Por ejemplo, después de una compilación, es posible que desee que sus binarios se empaqueten y copien en una ubicación especial, o que se cree un paquete de instalación o que se ejecute una herramienta de documentación en ellos. Un servidor de CI realiza muchas tareas diferentes que no tienen sentido en una máquina de desarrollador, por lo que si bien podría crear un proyecto IDE que realizara todos estos pasos, tendría que mantener dos de ellos: un proyecto para desarrolladores y otro para compilaciones. Algunas tareas de compilación (análisis estático, por ejemplo) pueden llevar mucho tiempo que no desearía para proyectos de desarrollador.

En resumen, es simplemente más fácil: cree un script para hacer todas las cosas que desee y es rápido y sencillo iniciarlo en la línea de comandos o en la configuración de un servidor de compilación.

gbjbaanb
fuente
9
make

es mucho más fácil de recordar y escribir que

gcc -o myapp -I/include/this/dir -I/include/here/as/well -I/dont/forget/this/one src/myapp.c src/myapp.h src/things/*.c src/things/*.h

Y los proyectos pueden tener comandos de compilación muy complejos. Un script de compilación también tiene la capacidad de recompilar solo las cosas que cambiaron. Si quieres hacer una compilación limpia,

make clean

es más fácil y más confiable una vez configurado correctamente que intentar recordar todos y cada uno de los lugares en los que puede haberse producido un archivo intermedio.

Por supuesto, si usa un IDE, también es fácil hacer clic en un botón de compilación o limpieza. Sin embargo, es mucho más difícil automatizar el movimiento del cursor a un lugar específico en la pantalla, especialmente cuando ese lugar puede moverse si la ventana se mueve, que automatizar un comando de texto simple.

8bittree
fuente
4

¿De qué otra manera lo harías? La única otra forma es especificar un comando de línea de comando largo.

Otra razón es que los archivos MAKE permiten una compilación incremental, lo que acelera mucho el tiempo de compilación.

Los Makefiles también pueden hacer un proceso de construcción multiplataforma. CMake genera diferentes scripts de compilación basados ​​en la plataforma.

Editar:

Con un IDE, estás atado a una forma particular de hacer las cosas. Muchas personas usan vim o emacs a pesar de que no tienen muchas características similares a IDE. Lo hacen porque quieren el poder que proporcionan estos editores. Los scripts de compilación son necesarios para aquellos que no usan un IDE.

Incluso para aquellos que usan un IDE, es posible que desee saber realmente qué está sucediendo, por lo que el script de compilación le ofrece los detalles de implementación que un enfoque de GUI no tiene.

Los IDE también usan scripts de construcción internamente; el botón ejecutar es solo otra forma de ejecutar el comando make.

phil
fuente
4

Las respuestas anteriores cubren mucho terreno bueno, pero un ejemplo del mundo real que me gustaría agregar (que no puedo agregar como comentario debido a que no hay karma), es de la programación de Android.

Soy un desarrollador teléfono Android / iOS / Windows profesional, y utilizar los servicios de las API de Google (Google Maps) en su mayoría un montón .

En Android, estos servicios requieren que agregue un almacén de claves , o un tipo de archivo de ID de desarrollador que le dice a Google que soy quien digo que soy, a una consola de desarrollador. Si mi aplicación está compilada con un almacén de claves diferente, la sección Google Maps de la aplicación no funcionará.

En lugar de agregar y administrar una docena de almacenes de claves a la consola del desarrollador, de todos modos solo uno de los cuales se puede usar para actualizar la aplicación, incluyo este almacén de claves en nuestro repositorio seguro y uso Gradle para decirle a Android Studio exactamente qué almacén de claves usar al compilar para "depurar" o "liberar". Ahora, solo tengo que agregar dos almacenes de claves a mi consola de desarrollador de Google, uno para "depurar" y otro para "liberar", y todos los miembros de mi equipo pueden clonar el repositorio y comenzar a desarrollar sin tener que ir al desarrollador consola y agregue el hash SHA de su almacén de claves particular, o peor, haciéndome administrarlos. Esto tiene el beneficio adicional de dar a cada miembro del equipo una copia del almacén de claves de firma, lo que significa que si estoy fuera de la oficina y se programa una actualización, un miembro del equipo solo necesita seguir una lista muy breve de instrucciones para impulsar un actualizar.

La automatización de construcciones como esta mantiene las construcciones consistentes y reduce la deuda técnica al reducir el tiempo de configuración cuando obtenemos un nuevo desarrollador, una nueva máquina o cuando tenemos que volver a crear una imagen de una máquina.

usuario2170639
fuente
1

Ventajas del script de construcción:

  • los cambios se ven como código (por ejemplo, en un comando git diff), no como diferentes opciones marcadas en un diálogo

  • creando más resultados que una compilación simple

En algunos de mis proyectos anteriores, he usado los scripts de compilación para:

  • generar la documentación del proyecto (basada en doxygen)
  • construir
  • ejecutar pruebas unitarias
  • generar informes de cobertura de pruebas unitarias
  • empacar binarios en un archivo de lanzamiento
  • generar notas de lanzamiento internas (basadas en mensajes "git log")
  • pruebas automatizadas
utnapistim
fuente
0

A menudo puede llamar al botón "compilar" de forma automatizada (Visual Studio acepta argumentos de línea de comandos, por ejemplo). Las personas escriben scripts de compilación tan pronto como necesitan algo que el botón de compilación no puede proporcionar.

Por ejemplo, la mayoría de los IDE solo le permitirán construir una plataforma a la vez. O solo un idioma a la vez. Luego está lo que hace con las salidas integradas: ¿puede su IDE agruparlas en un paquete de instalación?

pjc50
fuente