Respuestas:
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.
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:
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:
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.
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.