Preguntas frecuentes

Si tienes preguntas o necesitas asistencia, consulta Obtén ayuda.

¿Qué es Bazel?

Bazel es una herramienta que automatiza las compilaciones y pruebas de software. Las tareas de compilación admitidas incluyen la ejecución de compiladores y vinculadores para producir bibliotecas y programas ejecutables, además de 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 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 pequeñas bibliotecas, objetos binarios y pruebas interconectadas. Por el contrario, con herramientas como Make, debes describir archivos individuales y también invocaciones del compilador.
  • Compatibilidad con varias plataformas: 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 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, prueba y objeto binario deben especificar sus dependencias directas por completo. Bazel usa esta información de dependencia para saber qué se debe volver a compilar cuando realizas cambios en un archivo de origen y qué tareas pueden ejecutarse 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 tardan alrededor de 200 ms.

¿Por qué Google no usa...?

  • Make, Ninja: Estas herramientas brindan un control muy exacto sobre los comandos que se invocan para compilar archivos, pero depende del usuario escribir las reglas que sean 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 host". Estas reglas se probaron para ser infalibles.
  • Ant y Maven: Ant y Maven están orientados principalmente a Java, mientras que Bazel controla varios lenguajes. Bazel fomenta la subdivisión de las bases de código en unidades reutilizables más pequeñas y puede reconstruir solo las que deban 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 están mucho más estructurados que los de Gradle, lo que permite que Bazel entienda exactamente qué hace cada acción. Esto permite un mayor paralelismo y una mejor reproducibilidad.
  • Pants, Buck: Ambas herramientas fueron creadas y desarrolladas por exGooglers 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 provino Bazel?

Bazel es una variante de la herramienta que Google usa para compilar el software de su servidor de manera interna. También se expandió para compilar otros tipos de software, como apps para dispositivos móviles (iOS o Android) que se conectan a nuestros servidores.

¿Reescribiste 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 utilizando archivos makefile generados por grandes dimensiones. Esto provocó compilaciones lentas y poco confiables, que comenzaron a interferir en la productividad de nuestros desarrolladores y en 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 la ejecución y el almacenamiento en caché remotos 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 del servidor, usamos el siguiente flujo de trabajo de desarrollo:

  • Todo nuestro código de servidor está en un único y gigantesco sistema de control de versiones.
  • Todos compilan su software con Bazel.
  • Los diferentes equipos son propietarios de distintas partes del árbol de fuentes y ponen sus componentes a disposición como objetivos de BUILD.
  • La ramificación se usa principalmente para administrar versiones, por lo que todos desarrollan su software en la revisión principal.

Bazel es un pilar de esta filosofía: dado que Bazel requiere que todas las dependencias estén completamente especificadas, podemos predecir qué programas y pruebas se verán afectados por un cambio y revisarlos antes del envío.

Para obtener más información sobre el proceso de desarrollo de Google, consulta el blog de herramientas de Ing.

¿Por qué abriste Bazel?

Compilar software debe ser fácil y divertido. Las compilaciones lentas e impredecibles le quitan la diversión a la programación.

¿Por qué querría usar Bazel?

  • Bazel puede brindarte tiempos de compilación más rápidos, ya que solo puede volver a compilar los archivos que deban volver a compilarse. Del mismo modo, puede omitir la nueva ejecución de pruebas que sabe que no cambiaron.
  • Bazel produce resultados deterministas. Esto elimina el sesgo entre las compilaciones incrementales y limpias, la laptop y el sistema de CI, etcétera.
  • Bazel puede compilar diferentes apps de cliente y 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 app para dispositivos móviles actualizada funcione con el servidor actualizado, compilando ambos con la misma herramienta y cosechando todos los beneficios de Bazel antes mencionados.

¿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 perfil 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) 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 sencilla, siempre que haya un JDK disponible para la plataforma.

¿Para qué no debo usar Bazel?

  • Bazel intenta ser inteligente a la hora de almacenar en caché. Esto significa que no es útil 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 con la instancia de QA de tu sitio.
    • Un paso de la implementación que cambia la configuración de la nube de tu sitio.
  • Si tu compilación consta de unos pocos pasos secuenciales largos, es posible que Bazel no te ayude mucho. Obtendrás más velocidad si divides los pasos largos en objetivos discretos y más pequeños 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 probaron exhaustivamente y tienen muy poca deserción. Del mismo modo, probamos versiones nuevas de Bazel en cientos de miles de objetivos todos los días para encontrar regresiones y lanzamos versiones nuevas varias veces al mes.

En resumen, a excepción de las funciones marcadas como experimentales, Bazel debería funcionar. Los cambios en reglas no experimentales serán retrocompatibles. 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?

Dentro de Google, nos aseguramos de que las fallas de Bazel sean muy poco frecuentes. 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 o Fedora 21. Esto resuelve el problema de reproducibilidad del 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 escrito de forma incorrecta dentro de un contenedor de Docker puede generar resultados impredecibles.

Dentro de Google, verificamos las herramientas en el control de código fuente para garantizar su reproducibilidad. De esta forma, podemos examinar los cambios en las herramientas (“actualizar GCC a la versión 4.6.1”) con el mismo mecanismo que los cambios en las bibliotecas base (“corrección de límites en OpenSSL”).

¿Puedo compilar objetos binarios para implementar en Docker?

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

Sí, en el caso de los binarios de Java y C++, suponiendo que no cambias la cadena de herramientas. Si tienes pasos de compilación que involucran 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 declararon. La ejecución en zonas de pruebas (–spawn_strategy=sandboxed, solo en Linux) puede ayudar a encontrar dependencias no declaradas.
  • Evita almacenar marcas de tiempo y ID 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 ayudar en este caso.
  • Evita los procesos que usen números aleatorios. En particular, el recorrido del diccionario es aleatorio en muchos lenguajes de programación.

¿Tienes actualizaciones binarias?

Sí, puedes encontrar los objetos binarios de versión más recientes y revisar nuestra política de lanzamiento.

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

En el caso de IntelliJ, consulta el complemento de IntelliJ con Bazel.

En el caso de Xcode, visita Tulsi.

Para Eclipse, consulta el complemento E4B.

Para 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, y esto debería ser suficiente para la integración básica de CI. Dado que Bazel no necesita compilaciones limpias para su corrección, el sistema de CI no debe estar configurado para que limpie antes de comenzar una compilación o ejecución de prueba.

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

¿Qué funciones futuras podemos esperar en Bazel?

Consulta nuestras hojas de ruta.

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

Bazel es extensible. Cualquier persona puede agregar compatibilidad con idiomas nuevos. Se admiten varios idiomas: consulta la enciclopedia de compilación 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 cómo 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.

¿Ya terminaste de usar Bazel con código abierto?

El trabajo en código abierto Bazel está en desarrollo. En particular, seguimos trabajando en el uso del código abierto:

  • Muchas de nuestras pruebas de integración y unidad (lo que debería facilitar el aporte de parches)
  • Integración completa en IDE

Más allá del código, nos gustaría que, con el tiempo, todas las revisiones de código, el seguimiento de errores y las decisiones de diseño se hicieran públicas, con la participación de la comunidad de Bazel. Aún 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 todavía esté ocurriendo dentro de Google. Avísanos si hay alguna información poco clara o injustificada mientras realizamos 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 tecnología específica de Google, o bien estamos buscando una excusa de deshacerse (o una combinación de ambas opciones). Estas partes de la base de código no están disponibles en GitHub y probablemente nunca lo estarán.

¿Cómo me comunico con el equipo?

Para comunicarte con nosotros, escríbenos a bazel-discuss@googlegroups.com.

¿Dónde informo los errores?

Abre un problema en GitHub.

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

Este es un nombre interno para la herramienta. Usa Bazel como Bazel.

¿Por qué otros proyectos de Google (Android y Chrome) utilizan 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 representaba un problema para compilar aplicaciones de este sistema operativo, como Chrome. Dado que el proyecto maduró y se estabilizó, el Proyecto de código abierto de Android está en proceso de migrar 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: /StatBaja