Preguntas frecuentes

Informar un problema Ver fuente Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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 la ejecución de compiladores y enlazadores para producir programas y bibliotecas ejecutables, y el ensamblaje de 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 características:

  • 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, archivos binarios y pruebas interconectados. En cambio, con herramientas como Make, debes describir archivos individuales e invocaciones del compilador.
  • Compatibilidad con múltiples plataformas: Se pueden usar la misma herramienta y los mismos archivos BUILD para compilar software para diferentes arquitecturas y hasta diferentes plataformas. En Google, usamos Bazel para compilar todo, desde aplicaciones de servidor que se ejecutan en sistemas de nuestros centros de datos hasta apps cliente que se ejecutan en teléfonos celulares.
  • Reproducibilidad: En los archivos BUILD, cada biblioteca, prueba y archivo binario debe 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 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 controlar compilaciones grandes. En Google, es común que un archivo binario del servidor tenga 100,000 archivos fuente, y las compilaciones en las que no se cambiaron archivos tardan alrededor de 200 ms.

¿Por qué Google no usa…?

  • Make y Ninja: Estas herramientas brindan un control muy exacto sobre qué comandos se invocan para compilar 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”. Estas reglas se probaron en situaciones reales para garantizar su eficacia.
  • Ant y Maven: Ant y Maven están principalmente orientados a Java, mientras que Bazel admite varios lenguajes. Bazel fomenta la subdivisión de las bases de código en unidades más pequeñas y reutilizables, y puede volver a compilar solo las que lo necesiten. 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.
  • Pants y Buck: Ambas herramientas fueron creadas y desarrolladas por exempleados de Google en Twitter y Foursquare, y Facebook, respectivamente. Se modelaron según Bazel, pero sus conjuntos de funciones son diferentes, por lo que no son alternativas viables para nosotros.

¿De dónde surgió Bazel?

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

¿Reescribiste tu 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 usan para millones de compilaciones todos los días.

¿Por qué Google creó Bazel?

Hace mucho tiempo, Google compilaba su software con archivos Makefiles grandes y generados. Esto generó compilaciones lentas y poco confiables, lo que comenzó 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?

De forma predeterminada, Bazel ejecuta operaciones de compilación de forma local. 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 se encuentra en un único y gigantesco sistema de control de versiones.
  • Todos compilan su software con Bazel.
  • Diferentes equipos son propietarios de diferentes partes del árbol de origen y ponen sus componentes a disposición como destinos BUILD.
  • Las bifurcaciones se usan principalmente para administrar versiones, por lo que todos desarrollan su software en la revisión principal.

Bazel es la piedra angular de esta filosofía: dado que Bazel requiere que todas las dependencias se especifiquen por completo, podemos predecir qué programas y pruebas se ven afectados por un cambio, y verificarlos antes del envío.

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

¿Por qué abriste Bazel?

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

¿Por qué debería usar Bazel?

  • Bazel puede ofrecerte tiempos de compilación más rápidos porque solo puede volver a compilar los archivos que necesitan recompilarse. Del mismo modo, puede omitir la repetición de pruebas que sabe que no cambiaron.
  • Bazel produce resultados determinísticos. Esto elimina la asimetría entre las compilaciones incrementales y las limpias, el sistema de CI y la laptop, etcétera.
  • Bazel puede compilar diferentes apps 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 y aprovechando 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.

¿Para qué es mejor 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 y cuando haya un JDK disponible para la plataforma.

¿Para qué no debería usar Bazel?

  • Bazel intenta ser inteligente con el almacenamiento en caché. 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:
    • Es 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.
    • Es un paso de implementación que cambia la configuración de la nube de tu sitio.
  • Si tu compilación consta de unos pocos pasos largos y secuenciales, es posible que Bazel no pueda ayudarte mucho. Obtendrás más velocidad si divides los pasos largos en objetivos más pequeños y discretos que Bazel puede ejecutar en paralelo.

¿Qué tan estable es el conjunto de funciones de Bazel?

Las funciones principales (reglas de C++, Java y shell) se usan mucho en Google, por lo que se prueban a fondo y tienen muy poco cambio. Del mismo modo, probamos nuevas versiones de Bazel en cientos de miles de destinos todos los días para encontrar regresiones y lanzamos nuevas versiones varias veces al mes.

En resumen, excepto por las funciones marcadas como experimentales, Bazel debería funcionar sin problemas. Los cambios en las reglas no experimentales serán retrocompatibles. En nuestro documento de asistencia, encontrarás una lista más detallada de los estados de compatibilidad de las funciones.

¿Qué tan estable es Bazel como objeto binario?

En Google, nos aseguramos de que las fallas de Bazel sean muy poco frecuentes. Esto también debería aplicarse a nuestra base de código de código abierto.

¿Cómo puedo comenzar a usar Bazel?

Consulta Primeros pasos.

¿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 imperfecta dentro de un contenedor de Docker aún puede generar resultados impredecibles.

En Google, registramos las herramientas en el control de código fuente para garantizar la reproducibilidad. De esta manera, podemos verificar los cambios en las herramientas (“actualizar GCC a 4.6.1”) con el mismo mecanismo que los cambios en las bibliotecas básicas (“corregir la verificación de límites en OpenSSL”).

¿Puedo compilar archivos binarios para la implementación en Docker?

Con Bazel, puedes compilar archivos binarios independientes vinculados de forma estática en C/C++ y archivos .jar autónomos para Java. Estos se ejecutan con pocas dependencias en sistemas UNIX normales y, por lo tanto, deberían ser fáciles de instalar dentro de un contenedor de Docker.

Bazel tiene convenciones para estructurar programas más complejos, por ejemplo, un programa en 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 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 sean reproducibles automáticamente?

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

  • 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.
  • Evita almacenar marcas de tiempo y IDs de usuario en los archivos generados. Los archivos ZIP y otros archivos son especialmente propensos a esto.
  • Evita conectarte a la red. La ejecución en zona de pruebas también puede ser útil en este caso.
  • Evita los procesos que usan números aleatorios. En particular, el recorrido del diccionario se aleatoriza en muchos lenguajes de programación.

¿Tienes lanzamientos binarios?

Sí, puedes encontrar los binarios de la versión más reciente y revisar nuestra política de versiones

Uso Eclipse, IntelliJ o Xcode. ¿Cómo interactúa Bazel con los IDE?

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

Para XCode, consulta Tulsi.

En el caso de 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 interactúa Bazel con los sistemas de CI?

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

En el Manual de usuario, se incluyen más detalles sobre los códigos de salida.

¿Qué funciones futuras podemos esperar en Bazel?

Consulta nuestras Hojas de ruta.

¿Puedo usar Bazel para mi proyecto de 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 quieres desarrollar extensiones o aprender cómo funcionan, consulta la documentación para extender Bazel.

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

Consulta nuestros lineamientos para colaboradores.

¿Por qué no se realiza todo el desarrollo de forma abierta?

Aún tenemos que refactorizar las interfaces entre el código público en Bazel y nuestras extensiones internas con frecuencia. Esto dificulta el desarrollo abierto.

¿Terminaste de convertir Bazel en código abierto?

La publicación de Bazel como código abierto es un trabajo en curso. En particular, aún estamos trabajando en el código abierto de lo siguiente:

  • Muchas de nuestras pruebas de integración y unidad (que deberían facilitar la contribución de parches)
  • Integración completa en el 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 realicen de forma pública, con la participación de la comunidad de Bazel. Aún no llegamos 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 brindar asistencia a los desarrolladores externos y colaborar con ellos. Por lo tanto, abriremos el código, aunque parte del desarrollo aún se realice de forma interna en Google. Avísanos si algo no te parece claro o justificado a medida que realizamos 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 hemos estado buscando una excusa para deshacernos de ella (o es una combinación de ambas). 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?

Puedes comunicarte con nosotros a través de bazel-discuss@googlegroups.com.

¿Dónde puedo informar errores?

Abre un problema en GitHub.

¿Qué significa la palabra “Blaze” en la base de código?

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

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

Hasta el primer lanzamiento (alfa), Bazel no estaba disponible de forma externa, 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 era 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”?

De la misma manera que "basil" (la hierba) en inglés de EE.UU.: "BAY-zel". Rima con "hazel". IPA: /ˈbeɪzˌəl/