comparando sbt y Gradle [cerrado]

110

Me estoy sumergiendo en Scala y noté sbt. Estoy bastante contento con Gradle en proyectos java / maravillosos, y sé que hay un complemento de Scala para Gradle.

¿Cuáles podrían ser buenas razones para favorecer sbt sobre Gradle en un proyecto de Scala?

Hans Westerbeek
fuente
SBT en cierto sentido es como un Vim: si lo asimilas, estarás complacido. Y, por cierto, también hay maven y lein (fue creado para clojure, pero también funciona con scala).
om-nom-nom
18
No se sienta presionado para pasar a SBT. Algunos miembros conocidos de la comunidad de Scala usan Gradle. En su lugar, use SBT como un experimento, sabiendo que puede usar Gradle en su lugar.
Daniel C. Sobral
6
gracias a todos ... Habiendo leído sus ideas, me quedo con Gradle. Me parece que ahí es donde van a estar la mayoría de los esfuerzos de construcción de herramientas para el espacio JVM cuando dejemos atrás a Maven.
Hans Westerbeek
10
Es molesto que esta pregunta esté marcada como 'basada en opiniones' aquí, probablemente por personas que no trabajan en el espacio JVM todo el tiempo (y por lo tanto carecen de supervisión). Las respuestas a continuación son fácticas y están desprovistas de guerra santa.
Hans Westerbeek
4
No, esas respuestas son principalmente declaraciones de hechos comprobables, no opiniones. Si bien esta pregunta podría atraer respuestas inútiles, de hecho no lo ha hecho. Debe permanecer abierto como una descripción útil de las diferencias reales entre las herramientas.
erickson

Respuestas:

61

Tenga en cuenta que una diferencia clave entre SBT y Gradle es su gestión de dependencias :

  • SBT : Ivy , con una revisión que se puede dar como fija (1.5.2, por ejemplo) o como última (o dinámica).
    Consulte " Dependencia de Ivy ".
    Eso significa que el soporte del mecanismo "-SNAPSHOT" puede ser problemático, aunque Mark Harrah detalla en este hilo :

Es cierto que la caché puede confundirse, pero no es cierto que Ivy no entienda la resolución de instantáneas. Eugene explicó este punto en otro hilo, quizás en la lista de administradores. Hay un problema con la actualización automática de sbt que se abordó en 0.12.

Lo que Ivy no admite, hasta donde yo sé, es publicar instantáneas de la manera que lo hace Maven. Creo que he dicho esto en otra parte, pero si alguien quiere mejorar la situación, mi opinión es que es mejor dedicar el esfuerzo a trabajar con el equipo de Gradle para reutilizar su código de gestión de dependencias.

Solo para informarle, los problemas con las dependencias de instantáneas de Ivy y Maven fueron una de las razones por las que Gradle finalmente reemplazó a Ivy con su propio código de administración de dependencias. Fue una gran tarea, pero nos trajo muchas bondades.

Este tweet menciona que la situación general podría evolucionar en el futuro:

Mark dijo en el pasado que estaba interesado en usar Gradle en lugar de Ivy para SBT.

(ambas herramientas pueden aprender unas de otras )

VonC
fuente
1
El mayor inconveniente que he conocido es que sbt es que no se pudo especificar que la regla no se recompile cada vez que se menciona. Las reglas integradas para java y scala tienen esta funcionalidad, pero no está expuesta para escribir reglas personalizadas. Por lo tanto, cada vez que genere un archivo de programa o documentación e incluso si genera un archivo jar, su tarea se realizará en cada llamada, independientemente de que se hayan realizado cambios en las fuentes. Incluso hacer es lo suficientemente inteligente, pero no SBT
ayvango
1
@ayvango No es el caso de sbt hoy en día. Hay muchos complementos que utilizan esta funcionalidad, como android-sdk-plugin
dant3
¿Sabes qué API se utiliza para esa funcionalidad?
ayvango
Entonces, ¿esto es algo que le falta a Ivy cuando se compara con maven y gradle? Eso es extraño
tribbloid
53

Para mí, las características clave de SBT son:

  • Compilación rápida (más rápida que fsc).
  • Compilación / prueba continua: el comando ~testrecompilará y probará su proyecto cada vez que guarde una modificación.
  • Compilación cruzada y publicación cruzada, en varias versiones de Scala.
  • Recuperación automática de dependencias con la compatibilidad correcta de la versión de Scala.

Las desventajas son:

  • Una sintaxis jeroglífica que tiende a desanimar a los nuevos usuarios (especialmente si provienen de Java)
  • No es una manera fácil de definir una "tarea": ​​si necesita un procedimiento de construcción especial, necesitará encontrar un complemento o escribir uno usted mismo.
paradigmático
fuente
¿Tengo razón en que existe / era necesaria la función de publicación / compilación cruzada debido a los problemas que Scala ha tenido con la incompatibilidad binaria hacia atrás?
Hans Westerbeek
1
Si. Y estos problemas pueden volver a ocurrir al pasar a Scala 2.10.
paradigmático
1
Hay dos diferencias más que agregaría: * En SBT, es más fácil autogestionar las dependencias, IMO. * El corredor de prueba SBT parece más rápido; Sospecho que hay alguna concurrencia astuta involucrada aquí, pero supongo. SBT parece un producto más capaz pero algo menos maduro.
Rick-777
25
+1 para la desventaja de la 'sintaxis jeroglífica'. Esa es mi mayor queja con SBT. La sobrecarga del operador siempre conduce al abuso: - /
Ron Dahlgren
7
La sintaxis críptica de SBT saca lo peor de Scala. Gradle se basa en un modelo de dominio bien pensado y una sintaxis sencilla.
nemoo
40

sbt es un Scala DSL y, por ello, Scala es un ciudadano de primera clase, por lo que, en principio, parece ser una buena opción.

Pero sbt sufre de importantes cambios incompatibles entre versiones, lo que dificulta encontrar el complemento que funcione correctamente para una tarea y hacer que funcione.

Personalmente renuncié a sbt, ya que estaba causando más problemas de los que resolvía. De hecho, me cambié a Gradle.

Imagínate.

Jens Schauder
fuente
2
Hasta donde yo sé, solo hubo un cambio muy importante: cuando sbt cambió de 0.7.xa 0.1.x
om-nom-nom
1
Si usa un complemento para sbt 0.11.2 y luego va a sbt 0.12, debe esperar a que el autor del complemento compile una nueva versión o hacerlo usted mismo. idea-sbt es un ejemplo.
fmpwizard
4
@fmpwizard La línea sbt 0.12 aún no está disponible ... Deja de difundir FUD.
paradigmático
3
No es que el sbt sea imposible de usar, nuestro equipo lo usa. Pero mi comentario fue para respaldar esta respuesta, que decía "... Pero sbt sufre de importantes cambios incompatibles entre las versiones, lo que dificulta encontrar el complemento que funcione correctamente para una tarea y hacer que funcione ..." , No puedo simplemente usar el complemento scct, tuve que modificarlo (sí, un pequeño cambio, pero luego tuve que publicarlo en algún lugar para que todo mi equipo pudiera acceder). Un dolor sin una buena razón.
fmpwizard
3
¿Puede realizar una compilación cruzada para diferentes versiones de Scala usando gradle?
Machisuji
4

Soy bastante nuevo en gradle y muy nuevo en sbt; lo que realmente me gusta de sbt hasta ahora es la consola interactiva. Me permite usar comandos como 'inspeccionar' para tener una mejor idea de lo que está sucediendo. AFAIK gradle no proporciona algo como este cajero automático.

eugenevd
fuente
-11

Sbt y gradle, ambos se basan en lenguajes tipados estáticamente ... pero sbt tiene pocas ventajas:

  • mejor compatibilidad con complementos, especialmente complementos automáticos
  • creación de tareas y gestión de dependencias entre tareas
  • sbt se adapta especialmente a proyectos de scala en el sentido de que admite compilaciones incrementales y la mayor parte del sbt en sí está escrito en scala y las definiciones de compilación de sbt están escritas en scala
  • sbt tiene soporte de shell interactivo con muchas tareas integradas útiles
  • El ciclo de vida predeterminado de sbt es bastante útil y puede hacer que los principiantes comiencen con bastante menos esfuerzo
Saby
fuente
1
Gradle se basa en groovy, que no es un lenguaje escrito estáticamente.
Vistritium
Gradle realiza la gestión de dependencias entre tareas, es lo más fácil posible crear una tarea, no tengo idea de cómo puede ser más fácil escribir un complemento que para gradle, que puede tomar complementos groovy, Java, gradle y posiblemente más.
Johnride