Preguntas más frecuentes

Si tiene preguntas o necesita ayuda, consulte Obtención de 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 enlazadores para producir bibliotecas y programas 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 fue diseñado para adaptarse a la forma en que se desarrolla el software en Google. Tiene las siguientes características:

  • Compatibilidad con varios idiomas: Bazel admite muchos idiomas y se puede ampliar 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 pequeñas bibliotecas, archivos binarios y pruebas interconectados. Por el contrario, con herramientas como Make, debe describir archivos individuales e invocaciones del compilador.
  • Soporte multiplataforma: la misma herramienta y los mismos archivos BUILD se pueden usar para crear software para diferentes arquitecturas e incluso diferentes plataformas. En Google, usamos Bazel para crear todo, desde aplicaciones de servidor que se ejecutan en sistemas en nuestros centros de datos hasta aplicaciones de cliente que se ejecutan en teléfonos móviles.
  • Reproducibilidad: en los archivos BUILD , cada biblioteca, prueba y binario debe especificar completamente sus dependencias directas. Bazel usa esta información de dependencia para saber qué se debe reconstruir cuando realiza 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 construcciones grandes; en Google, es común que un servidor binario tenga 100 000 archivos fuente, y las compilaciones en las que no se modificó ningún archivo demoran alrededor de ~200 ms.

¿Por qué Google no usa...?

  • Make, Ninja: estas herramientas brindan un control muy exacto sobre qué comandos se invocan para crear archivos, pero depende del usuario escribir reglas que sean 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 nociones como "plataforma de destino" y "plataforma de host". Estas reglas han sido probadas en batalla para ser infalibles.
  • Ant y Maven: Ant y Maven están orientados principalmente a Java, mientras que Bazel maneja varios idiomas. Bazel fomenta la subdivisión de las bases de código en unidades reutilizables más pequeñas y puede reconstruir solo las 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 están mucho más estructurados que los de Gradle, lo que le permite a Bazel entender exactamente lo que 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 y Foursquare, y Facebook respectivamente. Han sido modelados a partir de Bazel, pero sus conjuntos de funciones son diferentes, por lo que no son alternativas viables para nosotros.

¿De dónde viene Bazel?

Bazel es una versión de la herramienta que utiliza Google para construir internamente su software de servidor. Se ha ampliado para crear también otro software, como aplicaciones móviles (iOS, Android) que se conectan a nuestros servidores.

¿Reescribió su 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 creó Bazel?

Hace mucho tiempo, Google construyó su software utilizando Makefiles generados de gran tamaño. 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 fue una forma de resolver estos problemas.

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

Bazel ejecuta las operaciones de compilación localmente de forma predeterminada. Sin embargo, Bazel también puede conectarse a un clúster de compilación para compilaciones y pruebas aún más rápidas. Consulte nuestra documentación sobre ejecución remota y almacenamiento en caché 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, utilizamos el siguiente flujo de trabajo de desarrollo:

  • Todo el código de nuestro servidor está en un único y gigantesco sistema de control de versiones.
  • Todo el mundo construye su software con Bazel.
  • Diferentes equipos poseen diferentes partes del árbol de origen y hacen que sus componentes estén disponibles como objetivos BUILD .
  • La bifurcación se usa principalmente para administrar versiones, por lo que todos desarrollan su software en la revisión principal.

Bazel es una piedra angular de esta filosofía: dado que Bazel requiere que todas las dependencias estén completamente especificadas, podemos predecir qué programas y pruebas se ven afectados por un cambio y examinarlos antes de enviarlos.

Puede encontrar más antecedentes sobre el proceso de desarrollo en Google en el blog de herramientas de ingeniería.

¿Por qué abriste a Bazel?

La creación de software debe ser divertida y fácil. Las compilaciones lentas e impredecibles eliminan la diversión de la programación.

¿Por qué querría usar Bazel?

  • Bazel puede brindarle tiempos de compilación más rápidos porque puede volver a compilar solo los archivos que deben volver a compilarse. Del mismo modo, puede omitir la repetición de pruebas que sabe que no han cambiado.
  • Bazel produce resultados deterministas. Esto elimina el sesgo entre compilaciones incrementales y limpias, computadora portátil y sistema CI, etc.
  • Bazel puede crear diferentes aplicaciones de cliente y servidor con la misma herramienta desde el mismo espacio de trabajo. Por ejemplo, puede cambiar un protocolo cliente/servidor en una sola confirmación y probar que la aplicación móvil actualizada funciona con el servidor actualizado, creando ambos con la misma herramienta, obteniendo todos los beneficios de Bazel antes mencionados.

¿Puedo ver ejemplos?

Sí; vea un ejemplo simple o lea el código fuente de Bazel para ver un ejemplo más complejo.

¿En qué es mejor Bazel?

Bazel brilla en proyectos de construcción y prueba con las siguientes propiedades:

  • Proyectos con una gran base de código
  • Proyectos escritos en (múltiples) lenguajes compilados
  • Proyectos que se implementan en múltiples plataformas
  • Proyectos que tienen pruebas extensas

¿Dónde puedo ejecutar Bazel?

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

La migración 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 trata de ser inteligente con el almacenamiento en caché. Esto significa que no es bueno 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 obtiene datos de Internet.
    • Un paso de prueba que se conecta a la instancia de control de calidad de su sitio.
    • Un paso de implementación que cambia la configuración de la nube de su sitio.
  • Si su compilación consta de unos pocos pasos largos y secuenciales, es posible que Bazel no pueda ayudarlo mucho. Obtendrá más velocidad al dividir pasos largos en objetivos más pequeños y discretos que Bazel puede ejecutar en paralelo.

¿Qué tan estable es el conjunto de características de Bazel?

Las funciones principales (C++, Java y reglas de shell) tienen un amplio uso dentro de Google, por lo que se prueban exhaustivamente y tienen muy poca rotación. Del mismo modo, probamos nuevas versiones de Bazel en cientos de miles de objetivos todos los días para encontrar regresiones y lanzamos nuevas versiones varias veces al mes.

En resumen, a excepción de las características marcadas como experimentales, Bazel debería simplemente funcionar. Los cambios a las reglas no experimentales serán compatibles con versiones anteriores. Puede encontrar una lista más detallada de los estados de soporte de funciones en nuestro documento de soporte .

¿Qué tan estable es Bazel como binario?

Dentro de Google, nos aseguramos de que los bloqueos de Bazel sean muy raros. Esto también debería ser válido para nuestro código base de código abierto.

¿Cómo puedo empezar a usar Bazel?

Consulte Primeros pasos .

¿Docker no resuelve los problemas de reproducibilidad?

Con Docker puede crear fácilmente sandboxes con versiones de SO fijas, 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 Makefile escrito de forma imperfecta dentro de un contenedor Docker aún puede generar resultados impredecibles.

Dentro de Google, verificamos las herramientas en el control de fuente para la reproducibilidad. 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 ("comprobación de límites fijos en OpenSSL").

¿Puedo crear archivos binarios para implementarlos en Docker?

Con Bazel, puede crear archivos binarios independientes vinculados estáticamente en C/C++ y archivos jar autónomos para Java. Estos se ejecutan con pocas dependencias en los sistemas UNIX normales y, como tales, deberían ser fáciles de instalar dentro de un contenedor 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 dichos entornos como archivos independientes, de modo que puedan implementarse en diferentes sistemas, incluidas las imágenes de Docker.

¿Puedo crear imágenes de Docker con Bazel?

Sí, puede usar nuestras reglas de Docker para crear imágenes de Docker reproducibles.

¿Bazel hará que mis compilaciones sean reproducibles automáticamente?

Para los binarios de Java y C++, sí, suponiendo que no cambie la cadena de herramientas. Si tiene pasos de compilación que involucran recetas personalizadas (por ejemplo, ejecutar binarios a través de un script de shell dentro de una regla), deberá tener más cuidado:

  • No use dependencias que no fueron declaradas. La ejecución en espacio aislado (–spawn_strategy=sandboxed, solo en Linux) puede ayudar a encontrar dependencias no declaradas.
  • Evite almacenar marcas de tiempo e ID de usuario en archivos generados. Los archivos ZIP y otros archivos son especialmente propensos a esto.
  • Evite conectarse a la red. La ejecución en espacio aislado también puede ayudar aquí.
  • Evite los procesos que usan números aleatorios, en particular, el recorrido del diccionario es aleatorio en muchos lenguajes de programación.

¿Tiene versiones binarias?

Sí, puede encontrar los archivos binarios de la última versión y revisar nuestra política de versiones.

Yo uso Eclipse/IntelliJ/XCode. ¿Cómo interactúa Bazel con los IDE?

Para IntelliJ, consulte el complemento IntelliJ con Bazel .

Para XCode, echa un vistazo a Tulsi .

Para Eclipse, consulte el complemento E4B .

Para otros IDE, consulte la publicación del blog sobre cómo funcionan estos complementos.

Yo uso Jenkins/CircleCI/TravisCI. ¿Cómo interactúa Bazel con los sistemas CI?

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

Más detalles sobre los códigos de salida se encuentran en el Manual del usuario.

¿Qué características futuras podemos esperar en Bazel?

Consulte nuestras hojas de ruta .

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

Bazel es extensible. Cualquiera puede agregar soporte para nuevos idiomas. Se admiten muchos idiomas, consulte la enciclopedia de compilación para obtener una lista de recomendaciones y en awesomebazel.com para obtener una lista más completa.

Si desea desarrollar extensiones o aprender cómo funcionan, consulte la documentación para extender Bazel .

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

Consulte nuestras pautas de contribución .

¿Por qué no se hace todo el desarrollo al aire libre?

Todavía tenemos que refactorizar las interfaces entre el código público en Bazel y nuestras extensiones internas con frecuencia. Esto hace que sea difícil hacer mucho desarrollo al aire libre.

¿Has terminado de abrir Bazel?

El código abierto de Bazel es un trabajo en progreso. En particular, todavía estamos trabajando en código abierto:

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

Más allá del código, nos gustaría que eventualmente todas las revisiones de código, el seguimiento de errores y las decisiones de diseño se hicieran públicamente, con la comunidad de Bazel involucrada. Todavía no hemos llegado allí, 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, estamos abriendo el código, aunque parte del desarrollo todavía está ocurriendo internamente en Google. Háganos saber si algo parece poco claro o injustificado a medida que hacemos la transición a un modelo abierto.

¿Hay partes de Bazel que nunca serán de código abierto?

Sí, parte del código base se integra con la tecnología específica de Google o hemos estado buscando una excusa para deshacernos de ella (o es una combinación de las dos). Estas partes del código base no están disponibles en GitHub y probablemente nunca lo estarán.

¿Cómo contacto con el equipo?

Estamos disponibles en bazel-discuss@googlegroups.com.

¿Dónde reporto errores?

Abra un problema en GitHub .

¿Qué pasa con la palabra "Blaze" en el código base?

Este es un nombre interno para la herramienta. Por favor refiérase a Bazel como Bazel.

¿Por qué otros proyectos de Google (Android, Chrome) usan otras herramientas de compilación?

Hasta el primer lanzamiento (Alpha), 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 soporte de Windows fue un problema para crear aplicaciones de Windows, como Chrome. Dado que el proyecto ha madurado y se ha vuelto 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 "basil" (la hierba) en inglés estadounidense: "BAY-zel". Rima con "avellana". IPA: /ˈbeɪzˌəl/