Si tienes preguntas o necesitas asistencia, consulta Cómo obtener ayuda.
¿Qué es Bazel?
Bazel es una herramienta que automatiza las compilaciones y pruebas de software. Las tareas de compilación admitidas incluyen ejecutar compiladores y vinculadores para producir programas y bibliotecas ejecutables, y ensamblar paquetes implementables para Android, iOS y otros entornos de destino. Bazel es similar a otras herramientas, como Make, Ant, Gradle, Buck, Pants y Maven.
¿Qué tiene de especial Bazel?
Bazel se diseñó para ajustarse a la forma en que se desarrolla el software en Google. Tiene las siguientes funciones:
- Compatibilidad con varios lenguajes: Bazel admite muchos lenguajes y se puede extender para admitir lenguajes de programación arbitrarios.
- Lenguaje de compilación de alto nivel: Los proyectos se describen en el lenguaje
BUILD
, un formato de texto conciso que describe un proyecto como conjuntos de pruebas, objetos binarios y bibliotecas interconectadas pequeñas. Por el contrario, con herramientas como Make, debes describir los archivos individuales y las invocaciones del compilador. - Compatibilidad multiplataforma: Se pueden usar la misma herramienta y los mismos archivos
BUILD
a fin de compilar software para diferentes arquitecturas y plataformas. En Google, usamos Bazel para compilar de todo, desde aplicaciones de servidor que se ejecutan en sistemas de nuestros centros de datos hasta aplicaciones cliente que se ejecutan en teléfonos celulares. - Reproducibilidad: En los archivos
BUILD
, cada biblioteca, objeto binario y de prueba debe especificar por completo sus dependencias directas. Bazel usa esta información de dependencia para saber qué debe recompilarse cuando realizas cambios en un archivo fuente y qué tareas se pueden ejecutar en paralelo. Esto significa que todas las compilaciones son incrementales y siempre producirán el mismo resultado. - Escalable: Bazel puede manejar compilaciones grandes. en Google, es común que un objeto binario de servidor tenga 100,000 archivos de origen, y las compilaciones en las que no se cambiaron archivos tardan alrededor de 200 ms.
¿Por qué Google no usa...?
- Make, Ninja: Estas herramientas ofrecen un control muy exacto sobre los comandos que se invocan para compilar archivos, pero depende del usuario escribir las reglas correctas.
- Los usuarios interactúan con Bazel en un nivel superior. Por ejemplo, Bazel tiene reglas integradas para "prueba de Java", "objeto binario C++" y nociones como "plataforma de destino" y "plataforma de host". Estas reglas se sometieron a pruebas rigurosas como infalibles.
- Ant y Maven: Ant y Maven se orientan principalmente a Java, mientras que Bazel maneja varios lenguajes. Bazel recomienda subdividir las bases de código en unidades reutilizables más pequeñas y puede volver a compilar solo las que deben volver a compilarse. Esto acelera el desarrollo cuando se trabaja con bases de código más grandes.
- Gradle: Los archivos de configuración de Bazel son mucho más estructurados que los de Gradle, lo que le permite a Bazel entender exactamente qué hace cada acción. Esto permite un mayor paralelismo y una mejor reproducibilidad.
- Pants, Buck: Ambas herramientas fueron creadas y desarrolladas por ex-Googlers en Twitter, Foursquare y Facebook, respectivamente. Se basaron en Bazel, pero sus conjuntos de atributos son diferentes, por lo que no son alternativas viables para nosotros.
¿De dónde vino Bazel?
Bazel es una versión de la herramienta que Google usa para compilar su software de servidor internamente. Se expandió para desarrollar también otros software, como apps para dispositivos móviles (iOS o Android) que se conectan a nuestros servidores.
¿Rediscribiste tu herramienta interna como de código abierto? ¿Es un tenedor?
Bazel comparte la mayor parte de su código con la herramienta interna, y sus reglas se usan para millones de compilaciones todos los días.
¿Por qué Google compiló Bazel?
Hace mucho tiempo, Google compiló su software con archivos Make de gran tamaño generados. Esto condujo a compilaciones lentas y poco confiables, que comenzaron a interferir con la productividad de nuestros desarrolladores y la agilidad de la empresa. Bazel era una forma de resolver estos problemas.
¿Bazel requiere un clúster de compilación?
Bazel ejecuta operaciones de compilación de forma local de forma predeterminada. Sin embargo, Bazel también puede conectarse a un clúster de compilación para realizar compilaciones y pruebas aún más rápidas. Consulta nuestra documentación sobre ejecución y almacenamiento en caché remotos y almacenamiento en caché remoto para obtener más detalles.
¿Cómo funciona el proceso de desarrollo de Google?
Para nuestra base de código de servidor, usamos el siguiente flujo de trabajo de desarrollo:
- Todo el código de nuestro servidor está en un sistema único y gigante de control de versiones.
- Todos compilan su software con Bazel.
- Cada equipo posee distintas partes del árbol de fuentes y hace que sus componentes estén disponibles como objetivos
BUILD
. - La ramificación se usa principalmente para administrar lanzamientos, por lo que todos desarrollan su software en la revisión principal.
Bazel es una pieza fundamental de esta filosofía: como Bazel requiere que se especifiquen todas las dependencias, podemos predecir qué programas y pruebas se verán afectados por un cambio, y revisarlos antes del envío.
Puede encontrar más información sobre el proceso de desarrollo en Google en el blog de herramientas de eng.
¿Por qué abriste Bazel?
Crear software debe ser fácil y divertido. Las compilaciones lentas e impredecibles te quitan la diversión de la programación.
¿Por qué querría usar Bazel?
- Es posible que Bazel te brinde tiempos de compilación más rápidos, ya que puede volver a compilar solo los archivos que debes volver a compilar. Del mismo modo, puede omitir volver a ejecutar pruebas que sabe que no cambiaron.
- Bazel produce resultados deterministas. Esto elimina el sesgo entre las compilaciones incrementales y las limpias, las laptops y el sistema de CI, etcétera.
- Bazel puede compilar diferentes apps de cliente y servidor con la misma herramienta desde el mismo espacio de trabajo. Por ejemplo, puedes cambiar un protocolo cliente/servidor en una sola confirmación y probar que la app para dispositivos móviles actualizada funcione con el servidor actualizado, compilando ambos con la misma herramienta, lo que te permitirá aprovechar todos los beneficios de Bazel mencionados anteriormente.
¿Puedo ver ejemplos?
Sí; consulta un ejemplo simple o lee el código fuente de Bazel para ver un ejemplo más complejo.
¿Cuál es el mejor de Bazel?
Bazel se destaca por la compilación y prueba de proyectos con las siguientes propiedades:
- Proyectos con una base de código grande
- Proyectos escritos en (múltiples) lenguajes compilados
- Proyectos que se implementan en varias plataformas
- Proyectos que tienen pruebas exhaustivas
¿Dónde puedo ejecutar Bazel?
Bazel se ejecuta en Linux, macOS (OS X) y Windows.
La portabilidad a otras plataformas UNIX debería ser relativamente fácil, siempre que haya un JDK disponible para la plataforma.
¿Para qué no debo usar Bazel?
- Bazel intenta ser inteligente con respecto al almacenamiento en caché. Esto significa que no sirve para ejecutar operaciones de compilación cuyos resultados no deben almacenarse en caché. Por ejemplo, los siguientes pasos no deben ejecutarse desde Bazel:
- Un paso de compilación que recupera datos de Internet.
- Es un paso de prueba que se conecta a la instancia de QA de tu sitio.
- Un paso de implementación que cambia la configuración de nube de tu sitio
- Si tu compilación consta de varios pasos secuenciales largos, es posible que Bazel no pueda ayudarte mucho. Obtendrás más velocidad dividiendo los pasos largos en objetivos más pequeños y discretos que Bazel puede ejecutar en paralelo.
¿Qué tan estable es el conjunto de atributos de Bazel?
Las funciones principales (C++, Java y reglas de shell) se usan mucho en Google, por lo que se prueban exhaustivamente y tienen muy poca deserción. Del mismo modo, todos los días probamos nuevas versiones de Bazel en cientos de miles de objetivos para detectar regresiones, y lanzamos versiones nuevas varias veces todos los meses.
En resumen, excepto para las funciones marcadas como experimentales, Bazel debería simplemente funcionar. Los cambios en las reglas no experimentales serán retrocompatibles. Puede encontrar una lista más detallada de los estados de compatibilidad de las funciones en nuestro documento de asistencia.
¿Qué tan estable es Bazel como objeto binario?
Dentro de Google, nos aseguramos de que las fallas de Bazel sean muy raras. Esto también debería ser válido para nuestra base de código abierto.
¿Cómo puedo comenzar a usar Bazel?
Consulta Cómo comenzar.
¿ Docker no resuelve los problemas de reproducibilidad?
Con Docker, puedes crear fácilmente zonas de pruebas con versiones fijas del SO, por ejemplo, Ubuntu 12.04 y Fedora 21. Esto resuelve el problema de reproducibilidad para el entorno del sistema, es decir, “¿qué versión de /usr/bin/c++ necesito?”.
Docker no aborda la reproducibilidad con respecto a los cambios en el código fuente. Ejecutar Make con un archivo Make que se escribió incorrectamente dentro de un contenedor de Docker puede generar resultados impredecibles.
En Google, comprobamos la reproducibilidad de las herramientas en el control de código fuente. De esta manera, podemos examinar los cambios en las herramientas (“actualizar GCC a 4.6.1”) con el mismo mecanismo que los cambios en las bibliotecas base (“comprobar límites en OpenSSL”).
¿Puedo compilar objetos binarios para implementarlos en Docker?
Con Bazel, puedes compilar objetos binarios independientes vinculados estáticamente en C/C++, y archivos jar independientes para Java. Estos se ejecutan con pocas dependencias en los sistemas UNIX normales y, por lo tanto, deben ser fáciles de instalar dentro de un contenedor de Docker.
Bazel tiene convenciones para estructurar programas más complejos, por ejemplo, un programa Java que consume un conjunto de archivos de datos o ejecuta otro programa como subproceso. Es posible empaquetar esos entornos como archivos independientes, de modo que se puedan implementar en diferentes sistemas, incluidas las imágenes de Docker.
¿Puedo compilar imágenes de Docker con Bazel?
Sí, puedes usar nuestras reglas de Docker para compilar imágenes de Docker reproducibles.
¿Bazel hará que mis compilaciones se puedan reproducir automáticamente?
Para los objetos binarios Java y C++, sí, suponiendo que no cambias la cadena de herramientas. Si tienes pasos de compilación que implican recetas personalizadas (por ejemplo, la ejecución de objetos binarios a través de una secuencia de comandos de shell dentro de una regla), deberás tener cuidado adicional:
- No uses dependencias que no se declararon. La ejecución en zona de pruebas (–spawn_strategy=sandboxed, solo en Linux) puede ayudar a encontrar dependencias no declaradas.
- Evita almacenar marcas de tiempo o IDs de usuario en archivos generados. Los archivos ZIP y otros archivos son más propensos a esto.
- Evita conectarte a la red. La ejecución en zonas de pruebas también puede ser útil en este caso.
- Evita los procesos que usen números aleatorios, en particular, el recorrido de diccionario es aleatorio en muchos lenguajes de programación.
¿Tienes versiones binarias?
Sí, puedes encontrar los objetos binarios de lanzamiento más recientes y revisar nuestra política de lanzamiento
Uso Eclipse/IntelliJ/XCode. ¿Cómo interopera Bazel con los IDE?
Para IntelliJ, consulta el complemento de IntelliJ con Bazel.
Para Xcode, visita Tulsi.
Para Eclipse, consulta el complemento E4B.
Para conocer otros IDE, consulta la entrada de blog sobre cómo funcionan estos complementos.
Uso Jenkins/CircleCI/TravisCI. ¿Cómo interopera Bazel con los sistemas de CI?
Bazel muestra un código de salida distinto de cero si falla la invocación de compilación o prueba, lo que debería ser suficiente para la integración básica de CI. Dado que Bazel no necesita compilaciones limpias para ser correctas, el sistema de CI no debe configurarse para limpiar antes de comenzar una ejecución de compilación o prueba.
Puedes encontrar más información sobre los códigos de salida en el Manual de usuario.
¿Qué funciones futuras podemos esperar en Bazel?
Consulta nuestras Mapas de ruta.
¿Puedo usar Bazel para mi proyecto INSERT LANGUAGE HERE?
Bazel es extensible. Cualquier persona puede agregar compatibilidad con idiomas nuevos. Se admiten muchos idiomas. Consulta la enciclopedia de compilación para obtener una lista de recomendaciones y awesomebazel.com para obtener una lista más completa.
Si deseas desarrollar extensiones o saber cómo funcionan, consulta la documentación para extender Bazel.
¿Puedo contribuir a la base de código de Bazel?
Consulta nuestros lineamientos para contribuciones.
¿Por qué no todo el desarrollo se realiza de forma abierta?
Aún debemos refactorizar con frecuencia las interfaces entre el código público en Bazel y nuestras extensiones internas. Esto dificulta mucho el desarrollo de forma abierta.
¿Terminaste de configurar Bazel en código abierto?
Bazel de código abierto está en desarrollo. En particular, todavía estamos trabajando en el uso de código abierto:
- Muchas de nuestras pruebas de integración y unidad (que deberían facilitar la contribución de parches).
- Integración completa del IDE.
Más allá del código, finalmente nos gustaría que todas las revisiones de código, el seguimiento de errores y las decisiones de diseño se realicen públicamente, con la participación de la comunidad de Bazel. Aún no hemos llegado a ese punto, por lo que algunos cambios simplemente aparecerán en el repositorio de Bazel sin una explicación clara. A pesar de esta falta de transparencia, queremos apoyar a los desarrolladores externos y colaborar. Por lo tanto, abriremos el código, aunque parte del desarrollo todavía se realice de forma interna en Google. Haznos saber si algo parece poco claro o injustificado durante la transición a un modelo abierto.
¿Hay partes de Bazel que nunca serán de código abierto?
Sí, parte de la base de código se integra con tecnología específica de Google, o bien estamos buscando una excusa para deshacernos de ella (o una combinación de ambas). Estas partes de la base de código no están disponibles en GitHub y probablemente nunca lo estén.
¿Cómo puedo comunicarme con el equipo?
Puedes escribirnos a bazel-discuss@googlegroups.com.
¿Dónde puedo informar errores?
Abre un problema en GitHub.
¿Qué pasa con la palabra "Blaze" en la base de código?
Es un nombre interno para la herramienta. Haz referencia a Blaze como Bazel.
¿Por qué otros proyectos de Google (Android, Chrome) usan otras herramientas de compilación?
Hasta la primera versión (Alfa), Bazel no estaba disponible externamente, por lo que los proyectos de código abierto como Chromium y Android no podían usarlo. Además, la falta original de compatibilidad con Windows fue un problema para compilar aplicaciones de Windows, como Chrome. Dado que el proyecto maduró y se volvió más estable, el Proyecto de código abierto de Android está en proceso de migración a Bazel.
¿Cómo se pronuncia “Bazel”?
Lo mismo que "albahaca" (la hierba) en inglés de EE.UU.: "BAY-zel". Rima con "avellana". IPA: /bezl/