¿Cuáles son las diferencias entre Bazel y Gradle?

Respuestas:

171

Descargo de responsabilidad: trabajo en Bazel y no estoy muy familiarizado con Gradle. Sin embargo, uno de mis compañeros de trabajo escribió una comparación de los dos sistemas, que parafrasearé aquí:

Bazel y Gradle enfatizan diferentes aspectos de la experiencia de construcción. Hasta cierto punto, sus prioridades son incompatibles: el deseo de Gradle de flexibilidad y no intromisión limita las restricciones que puede imponer a la estructura de construcción, mientras que el deseo de confiabilidad y rendimiento de Bazel necesariamente impone restricciones no negociables.

Gradle valora los mismos principios que Bazel, es decir, el equipo de Gradle presta gran atención al rendimiento (compilaciones incrementales, configuración y ejecución paralelas, el demonio de Gradle), la corrección (verificación "actualizada" basada en contenido) y la reproducibilidad (soporte completo para sintaxis declarativa, versiones de dependencia, dependencias declaradas explícitamente). Y Bazel respeta la necesidad de diseños de proyectos flexibles.

El matiz es que Gradle quiere promover las buenas prácticas, mientras que Bazel quiere exigirlas. Gradle apunta a un punto medio entre la experiencia Ant (libertad para definir su propia estructura de proyecto con resultados incoherentes) y la experiencia Maven (mejores prácticas forzadas sin espacio para las necesidades variables del proyecto). Bazel cree que el soporte flexible de proyectos es posible sin sacrificar las fuertes garantías que permiten sus poderosos flujos de trabajo.

Ninguna de las dos filosofías es más "correcta": la herramienta que mejor se adapte a un proyecto depende de los valores de ese proyecto en particular.

Descripción general de Gradle

Gradle es un sistema altamente flexible que facilita a los usuarios la construcción de flujos de construcción completos y confiables con restricciones mínimas sobre cómo organizan sus proyectos. Lo hace al proporcionar poderosos bloques de construcción (p. Ej., Seguimiento y recuperación de dependencias automáticos, soporte de complementos estrechamente integrado) con una interfaz genérica, completa de Turing, que puede combinar estos bloques como los usuarios lo deseen.

Gradle enfatiza las siguientes características:

  • Fácil migración desde otros sistemas. Gradle se adapta fácilmente a cualquier organización de proyectos para implementar fácilmente estructuras de flujo de trabajo arbitrarias. Entiende de forma nativa las tareas de Ant y se integra de forma nativa con los repositorios de Maven e Ivy.
  • Modelo de scripting altamente extensible. Los usuarios implementan toda la lógica de compilación escribiendo scripts Groovy. Una "compilación" es simplemente una ejecución secuencial de dependencias de tareas genéricas, que son esencialmente definiciones de métodos extensibles, reemplazables y de final abierto.
  • Rica gestión de dependencias. Las dependencias versionadas se pueden declarar y organizar automáticamente desde repositorios de código externos, sistemas de archivos locales y otros proyectos de Gradle. Las salidas de compilación también se pueden publicar automáticamente en repositorios y otras ubicaciones.
  • Completamente integrado sistema de complementos. Los complementos son simplemente paquetes de tareas organizadas para facilitar el flujo de trabajo deseado. Muchas de las características "principales" de Gradle se implementan realmente a través de complementos (por ejemplo, Java, Android). Los complementos interactúan (a su discreción) estrechamente con la lógica del script de compilación. Los complementos disfrutan de un acceso profundo a las estructuras de datos centrales de Gradle.

Descripción de Bazel

Bazel evolucionó a partir de la necesidad de construir proyectos internos de Google de manera confiable y eficiente. Debido a que el entorno de desarrollo de Google es inusualmente grande y complejo, Bazel ofrece garantías inusualmente sólidas sobre la integridad de sus compilaciones y una sobrecarga de rendimiento inusualmente baja para lograrlas.

Esto proporciona una base para poderosos flujos de trabajo de desarrollo basados ​​en compilaciones reproducibles, donde una "compilación" se convierte en una entidad abstracta a la que se puede hacer referencia, repetir, pasar a diferentes máquinas y pasar a programas y servicios arbitrarios de tal manera que se sabe que cada instancia es exactamente lo mismo.

Bazel enfatiza las siguientes características:

  • Exactitud. Las construcciones de Bazel están diseñadas para producir siempre resultados correctos, punto. Si dos usuarios invocan la misma compilación en la misma confirmación con los mismos indicadores de Bazel en máquinas diferentes, verán resultados idénticos. Las compilaciones incrementales son tan correctas como las compilaciones limpias, lo que hace que esta última sea esencialmente innecesaria.
  • Actuación. Las compilaciones están diseñadas para ejecutarse lo más rápido posible intrínsecamente dados los recursos disponibles para ellos. Las tareas son tan paralelizables como lo permiten sus cadenas de dependencia. El trabajo innecesario nunca se ejecuta (es decir, las tareas "actualizadas" siempre se omiten). El trabajo se puede dedicar naturalmente a los ejecutores remotos para superar los límites locales de la máquina.
  • Reproducibilidad Cualquier instancia de una compilación se puede reproducir fielmente en cualquier entorno. Por ejemplo, si un informe de error indica que la versión X del software Y falla en el entorno de producción Z, un desarrollador puede recrearlo fielmente en su propia máquina con la confianza de que están depurando lo mismo.
kristina
fuente
18
¿Está disponible públicamente la comparación de los dos sistemas? En caso afirmativo, ¿podría compartirlo?
Carlos Barcelona
43

Como los enlaces de artículos tienden a desaparecer, aquí hay un resumen de las opiniones del Equipo Gradle sobre Bazel (la mayoría se extraen directamente del artículo, que se publicó en marzo de 2015):

Fue diseñado para resolver un problema exclusivo de Google; una base de código monolítico masivo (cientos de millones de LOC).

La ventaja de paralelización que Bazel ofrece actualmente se combinará con "nuestra próxima nueva configuración y modelo de componente" (tenga en cuenta la fecha del artículo aquí).

Bazel no tiene un lenguaje de compilación declarativo de alto nivel que haga que la compilación sea fácil de usar para los desarrolladores. En Google, esto se puede compensar con un equipo de servicio especializado que posee la herramienta de compilación.

Bazel no está diseñado para la extensibilidad (aunque el equipo de desarrollo de Bazel lo ha contrarrestado con garantías de que están trabajando en la extensibilidad).

La velocidad se optimiza en torno a la idea de que todas las dependencias transitivas se almacenan en un gran repositorio; Todas las bibliotecas y herramientas se registran en este repositorio central. La mayoría de las empresas tienen más requisitos de administración de dependencias distribuidas.

Bazel es solo * nix, no se ejecuta en Windows. Esto elimina una gran cantidad de empresas potenciales.

No hay ecosistema de complementos.

RCross
fuente
17
Como una actualización para esta respuesta, tenga en cuenta que: 1. Bazel ha mejorado mucho en cuanto a la extensibilidad (ahora se admiten muchos idiomas nuevos gracias a la comunidad), 2. hay una versión experimental de Windows ( bazel.build/versions/master/docs/ windows.html ). El soporte de Windows debería mejorar mucho este año.
Laurent
3
Esta respuesta no es precisa. Bazel es extensible a través de un lenguaje de alto nivel llamado Starlark, que es muy similar a Python. Hay un ecosistema de complementos. Bazel funciona en Windows. Bazel no requiere un mono-repo.
sdgfsdh
2
"nuestra próxima nueva configuración y modelo de componente" que nunca sucedió. Parecen haber eliminado cualquier enlace a eso en el artículo de Gradle. Pero en 2014 probablemente estaban hablando de la "configuración del modelo basado en reglas" que ahora está en desuso . Ese pequeño experimento le costó mucho a Gradle, ya que casi dividió a la comunidad por la mitad.
Renato
1

Gradle se usa principalmente en el sistema ecológico JVM (Java, Ggroovy, Scala, Kotlin ...). Si su proyecto está en esta área y tiene que hacer la pregunta, Gradle o Maven sería una mejor opción. Para solucionar problemas de una compilación de Gradle, solo discutirá con el ecosistema Java y JVM.

Bazel en el corazón tiene la capacidad de detectar cambios incrementales (así como caché de compilación distribuida) y le permite reaccionar, aplicar complementos / reglas para lograr compilaciones incrementales. Para configurar y mantener esto se requiere un poco de conocimiento en CPP, Java y Python (Skylark) y también el conocimiento del administrador del sistema. Nuevamente, si tiene que hacer la pregunta, creo que Gradle o Maven sería una inversión más barata. Con Bazel puede construir cualquier idioma, de la forma que defina, más potencia, pero a un costo.

HoaPhan
fuente