Preguntas frecuentes

Informa un problema Ver código fuente

Si tiene alguna pregunta o necesita asistencia, consulte Cómo obtener ayuda.

¿Qué es Bazel?

Bazel es una herramienta que automatiza las compilaciones y pruebas de software. Las tareas de compilación compatibles incluyen ejecutar compiladores y vinculadores a fin de 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 adaptarse al modo 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 bibliotecas interconectadas pequeñas, objetos binarios y pruebas. Por el contrario, con herramientas como Make, debes describir archivos individuales y invocaciones del compilador.
  • Compatibilidad multiplataforma: Se puede usar la misma herramienta y los mismos archivos BUILD a fin de compilar software para diferentes arquitecturas y hasta diferentes plataformas. En Google, usamos Bazel para crear 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 de prueba y objeto binario debe especificar sus dependencias directas por completo. Bazel usa esta información de dependencia para saber qué se debe volver a compilar cuando se realizan cambios en un archivo de origen 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 sin archivos que se cambiaron toman aproximadamente 200 ms.

¿Por qué Google no usa...?

  • Make, Ninja: Estas herramientas proporcionan un control muy exacto sobre qué comandos se invocan para crear archivos, pero depende del usuario escribir reglas correctas.
    • Los usuarios interactúan con Bazel en un nivel superior. Por ejemplo, Bazel tiene reglas integradas para "Prueba de Java", "binario de C++" y conceptos como "plataforma de destino" y "plataforma de host". Se probó que estas reglas son infalibles.
  • Ant y Maven: Ant y Maven están orientados principalmente a Java, mientras que Bazel maneja varios lenguajes. Bazel fomenta la subdivisión de bases de código en unidades reutilizables más pequeñas y puede volver a compilar solo aquellas que necesitan reconstrucción. 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 permite que Bazel comprenda exactamente qué hace cada acción. Esto permite un mayor paralelismo y una mejor reproducibilidad.
  • Pantalones, Buck: Ambas herramientas fueron creadas y desarrolladas por antiguos empleados de Google en Twitter, Foursquare y Facebook, respectivamente. Se modelaron a partir de Bazel, pero sus conjuntos de atributos son diferentes, por lo que no son alternativas viables para nosotros.

¿De dónde proviene Bazel?

Bazel es una versión de la herramienta que Google usa para compilar su software de servidor de forma interna. También se amplió para crear otro software, como las apps para dispositivos móviles (iOS, Android) que se conectan a nuestros servidores.

¿Volvió a escribir su herramienta interna como código abierto? ¿Es un tenedor?

Bazel comparte la mayor parte de su código con la herramienta interna, y sus reglas se utilizan para millones de compilaciones todos los días.

¿Por qué Google creó Bazel?

Hace mucho tiempo, Google creó su software con archivos makefile grandes y generados. Esto provocó compilaciones lentas y poco confiables, lo que comenzó a interferir en la productividad de nuestros desarrolladores y la agilidad de la empresa. Bazel era una manera de resolver estos problemas.

¿Bazel requiere un clúster de compilación?

Bazel ejecuta las operaciones de compilación 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 el almacenamiento en caché y la ejecución remota y el 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 nuestro código de servidor se encuentra en un sistema único y gigantesco.
  • Todos compilan su software con Bazel.
  • Diferentes equipos poseen partes diferentes del árbol de fuentes y ponen sus componentes a disposición como objetivos BUILD.
  • Las ramas se usan principalmente para administrar actualizaciones, de modo que todos desarrollan su software en la revisión principal.

Bazel es un pilar de esta filosofía: dado que todas las dependencias deben especificarse completamente, podemos predecir qué programas y pruebas se ven afectados por un cambio, y examinarlos antes de su envío.

Puedes encontrar más información sobre el proceso de desarrollo en Google en el blog de herramientas de eng.

¿Por qué decidieron abrir Bazel?

Compilar software debe ser divertido y fácil. Las compilaciones impredecibles y lentas eliminan la programación.

¿Por qué querría usar Bazel?

  • Es posible que Bazel te otorgue tiempos de compilación más rápidos porque puede volver a compilar solo los archivos que se deban volver a compilar. Del mismo modo, puede omitir las repeticiones de pruebas que sabe que no cambiaron.
  • Bazel produce resultados deterministas. Esto elimina las desviaciones entre las compilaciones incrementales y limpias, las laptops y los sistemas de CI, etcétera.
  • Bazel puede compilar diferentes apps cliente y de servidor con la misma herramienta desde el mismo lugar de trabajo. Por ejemplo, puedes cambiar un protocolo cliente-servidor en una sola confirmación y probar que la aplicación para dispositivos móviles actualizada funciona con el servidor actualizado, compilando con la misma herramienta y cosechando todos los beneficios antes mencionados de Bazel.

¿Puedo ver ejemplos?

Sí. Consulta un ejemplo simple o lee el código fuente de Bazel para obtener un ejemplo más complejo.

¿Qué es lo mejor de Bazel?

Bazel se destaca en la compilación y prueba de proyectos con las siguientes propiedades:

  • Proyectos con una base de código grande
  • Proyectos escritos en varios idiomas compilados
  • Proyectos que se implementan en varias plataformas
  • Proyectos con pruebas exhaustivas

¿Dónde puedo ejecutar Bazel?

Bazel se ejecuta en Linux, macOS (OS X) y Windows.

La portabilidad a otras plataformas de UNIX debe ser relativamente fácil, siempre y cuando haya un JDK disponible para la plataforma.

¿Para qué no debo usar Bazel?

  • Bazel intenta usar el almacenamiento en caché de manera inteligente. Esto significa que no es adecuado para ejecutar operaciones de compilación cuyos resultados no se deben almacenar en caché. Por ejemplo, los siguientes pasos no se deben ejecutar desde Bazel:
    • Un paso de compilación que recupera datos de Internet
    • 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 la nube de tu sitio.
  • Si tu compilación consta de algunos pasos secuenciales largos, es posible que Bazel no pueda ayudarte mucho. Podrás obtener más velocidad si dividas los pasos largos en orientaciones discretas más pequeñas 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) tienen un uso extensivo en Google, por lo que se prueban exhaustivamente y tienen muy poca deserción. De manera similar, probamos versiones nuevas de Bazel en cientos de miles de destinos todos los días para encontrar regresiones y lanzamos versiones nuevas varias veces al mes.

En resumen, excepto para las funciones marcadas como experimentales, Bazel debería funcionar. Los cambios en las reglas no experimentales tendrán retrocompatibilidad. Puedes 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?

En Google, nos aseguramos de que los fallos de Bazel sean muy infrecuentes. Esto también debería conservar para nuestra base de código abierto.

¿Cómo puedo comenzar a usar Bazel?

Consulta Cómo comenzar.

¿No resuelve Docker los problemas de reproducibilidad?

Con Docker, puede crear fácilmente zonas de pruebas con versiones fijas del SO, por ejemplo, Ubuntu 12.04, 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 makefile imperfecto dentro de un contenedor de Docker aún puede generar resultados impredecibles.

Dentro de Google, controlamos las herramientas para controlar la reproducibilidad de la fuente. De esta manera, podemos evaluar los cambios en las herramientas (“actualizar GCC a 4.6.1”) con el mismo mecanismo que los cambios en las bibliotecas base (“comprobar los límites de corrección en OpenSSL”).

¿Puedo compilar objetos binarios para implementar en Docker?

Con Bazel, puedes compilar objetos binarios independientes y vinculados de forma estática en C/C++, y archivos JAR independientes para Java. Estos se ejecutan con pocas dependencias en 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, como 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 para 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 reproduzcan automáticamente?

Para los objetos binarios de Java y C++, sí, suponiendo que no cambias la cadena de herramientas. Si tienes pasos de compilación que incluyen recetas personalizadas (por ejemplo, ejecutar objetos binarios a través de una secuencia de comandos de shell dentro de una regla), deberás tener especial cuidado:

  • No uses dependencias que no se hayan declarado. La ejecución en zona de pruebas (–spawn_strategy=sandboxed, solo en Linux) puede ayudar a encontrar dependencias no declaradas.
  • Evite almacenar marcas de tiempo y User-ID en los archivos generados. los archivos ZIP y otros archivos suelen ser más propensos a esto.
  • Evita conectarte a la red. La ejecución en zona de pruebas también puede ser útil en este caso.
  • Evite los procesos que usan números aleatorios; en particular, el recorrido del diccionario es aleatorio en muchos lenguajes de programación.

¿Tienes lanzamientos binarios?

Sí. Puedes encontrar los objetos binarios de lanzamiento más recientes y consultar nuestra política de versiones.

Uso Eclipse/IntelliJ/XCode. ¿Cómo interopera la Bazel con los IDE?

Para IntelliJ, consulta el complemento de IntelliJ con Bazel.

Para Xcode, consulta Tulsi.

Para Eclipse, consulta el complemento E4B.

Para ver otros IDE, consulta esta entrada de blog sobre cómo funcionan estos complementos.

Uso Jenkins/CircleCI/TravisCI. ¿Cómo interopera la Bazel con los sistemas de CI?

Bazel muestra un código de salida distinto de cero si la invocación de prueba o compilación falla, y esto debería ser suficiente para la integración básica de CI. Dado que Bazel no necesita compilaciones limpias para la precisión, el sistema de CI no debe configurarse para limpiar antes de comenzar una compilación o ejecución de prueba.

Para obtener más información sobre los códigos de salida, consulta el Manual del usuario.

¿Qué funciones futuras se esperan para Bazel?

Consulta nuestras Carreteras.

¿Puedo usar Bazel para mi proyecto INSERTAR IDIOMA AQUÍ?

Bazel es extensible. Cualquier persona puede agregar compatibilidad con nuevos idiomas. Muchos idiomas son compatibles: consulta la enciclopedia de compilaciones para obtener una lista de recomendaciones y awesomebazel.com para obtener una lista más completa.

Si quieres desarrollar extensiones o saber cómo funcionan, consulta la documentación sobre la extensión de Bazel.

¿Puedo contribuir con la base de código de Bazel?

Consulta nuestros lineamientos para contribuir.

¿Por qué no se hace todo el desarrollo a la vista?

Aún debemos refactorizar las interfaces entre el código público de Bazel y nuestras extensiones internas con frecuencia. Esto dificulta mucho el desarrollo a la vista.

¿Terminaste de usar código abierto en Bazel?

Bazel de código abierto es un trabajo en curso. En particular, seguimos trabajando en el código abierto:

  • Muchas de nuestras pruebas de integración y unidad (lo que debería facilitar la contribución de parches)
  • Integración completa del IDE.

Más allá del código, nos gustaría que todas las revisiones de código, el seguimiento de errores y las decisiones de diseño se hicieran públicas, con la comunidad de Bazel involucrada. Todavía no estamos ahí, 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 aún se lleve a cabo internamente en Google. Avísanos si algo parece poco claro o injustificado cuando hagamos 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 la tecnología específica de Google o estábamos buscando una excusa para eliminar (o es una combinación de ambas). Estas partes de la base de código no están disponibles en GitHub y es probable que nunca lo estén.

¿Cómo puedo comunicarme con el equipo?

Escríbenos a bazel-discuss@googlegroups.com.

¿Dónde puedo informar errores?

Abre un problema en GitHub.

¿Cómo está la palabra "Blaze" en la base de código?

Este 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 tanto, los proyectos de código abierto como Chromium y Android no podían usarla. Además, la falta original de compatibilidad con Windows era un problema para crear aplicaciones de Windows, como Chrome. Como 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"?

De la misma manera que "albahaca" (la hierba) en inglés de EE.UU.: "BAY-zel". Rima con "hazel". IPA: /}}.