порівняння sbt та Gradle [закрито]


110

Я занурився в Scala і помітив sbt. Я дуже задоволений Gradle в проектах java / groovy, і знаю, що для Gradle є плагін Scala.

Які можуть бути вагомі причини надати перевагу sbt над Gradle у проекті Scala?


SBT у певному сенсі схожий на Vim: якщо ви його стогнете, ви будете задоволені. І, до речі, є також maven і lein (створений для клоджура, але працює і зі шкалою).
om-nom-nom

18
Не відчувайте тиску для переходу до SBT. Деякі відомі члени спільноти Scala використовують Gradle. Натомість використовуйте SBT в якості експерименту, знаючи, що ви можете просто використовувати Gradle.
Даніель К. Собрал

6
дякую всім ... Прочитавши вашу думку, я буду дотримуватися Gradle. Мені здається, що саме тут збираються більшість зусиль для побудови інструменту для простору JVM, коли ми залишаємо Мевена позаду.
Ганс Вестербек

10
Прикро, що це питання тут позначається як "засноване на думці", ймовірно, люди, які весь час не працюють у просторі JVM (і тому їм не вистачає нагляду). Нижче наведені відповіді - фактичні та позбавлені воєнного світу.
Ганс Вестербек

4
Ні, ці відповіді - це передусім твердження перевірених фактів, а не думки. Хоча це запитання могло б отримати непотрібні відповіді, але насправді цього не зробило. Він повинен залишатися відкритим, як корисний опис фактичних відмінностей між інструментами.
erickson

Відповіді:


61

Зауважте, що однією з ключових відмінностей між SBT і Gradle є управління залежністю :

  • SBT : Плющ , з переглядом, який може бути наданий як фіксований (наприклад, 1.5.2) або як останній (або динамічний).
    Див. " Залежність від плюща ".
    Це означає, що підтримка механізму "-SNAPSHOT" може бути проблематичною, навіть якщо деталі Марка Харра в цій темі :

Це правда, кеш може заплутатися, але це неправда, що Айві не розуміє вирішення знімків. Євген пояснив це в іншій темі, можливо, у списку адміністратора. Виникає проблема з автоматичним оновленням sbt, яке було вирішено в 0.12.

Те, що Ivy не підтримує, наскільки я знаю, публікує знімки таким чином, як це робить Maven. Я вважаю, що я це заявив в іншому місці, але якщо хтось хоче покращити ситуацію, я вважаю, що найкраще витратити зусилля, працюючи з командою Gradle, щоб повторно використовувати свій код управління залежністю.

Щоб повідомити вам, проблеми із залежними знімками Ivy та Maven були однією з причин, чому Gradle врешті-решт замінив Ivy власним кодом управління залежністю. Це було велике завдання, але принесло нам багато добра.

Цей твіт згадує, що вся ситуація може розвиватися в майбутньому:

У минулому Марк заявив, що йому було цікаво використовувати Gradle замість Ivy для SBT.

(обидва інструменти можуть вчитися один у одного )


1
Найбільш незручність, з якою я коли-небудь стикався, - це те, що ви не могли вказати для правила не перекомпілювати кожного разу, коли воно згадується. Вбудовані правила для Java та Scala мають цю функціональність, але вона не піддається написанню спеціальних правил. Тому щоразу, коли ви створюєте програмний файл або документацію, і навіть якщо ви створюєте файл jar, ваше завдання буде виконуватися під час кожного дзвінка незалежно від будь-яких змін джерел. Навіть make досить розумний, але не sbt
ayvango

1
@ayvango В даний час це не так. Є багато плагінів, які використовують цю функціональність, як android-sdk-plugin
dant3

Чи знаєте ви, який API використовується для цієї функції?
айванго

отже, цього плюща не вистачає при порівнянні з Maven & Gradle? Це дивно
триблоїд

53

Для мене ключовими особливостями SBT є:

  • Швидка компіляція (швидше, ніж fsc).
  • Постійна компіляція / тестування: команда ~testбуде перекомпілювати та перевіряти проект, кожен раз, коли ви зберігаєте модифікацію.
  • Крос-компіляція та крос-публікація у кількох версіях шкали.
  • Автоматичне отримання залежностей із правильною сумісністю версії scala.

Мінуси:

  • Ієрогліфічний синтаксис, який, як правило, відлякує нових користувачів (особливо якщо вони походять з Java)
  • Непростий спосіб визначити "завдання": якщо вам потрібна спеціальна процедура складання, вам потрібно буде або знайти плагін, або самостійно написати плагін.

Чи я правда, що існує / була необхідність у перехресній компіляції / публікації через проблеми, які у Скали виникли з бінарною несумісністю назад?
Ганс Вестербек

1
Так. І ці проблеми можуть повторитися знову при переході до Scala 2.10.
парадигматичний

1
Додаю ще дві відмінності: * У SBT простіше самоврядування залежностей, IMO. * Тест-бігун SBT здається швидшим; Я підозрюю, що тут задіяна якась хитра сукупність, але я гадаю. SBT здається більш здатним, але менш зрілим продуктом.
Rick-777

25
+1 - зворотний бік "ієрогліфічного синтаксису". Це мій найбільший захват від SBT. Перевантаження оператора завжди призводить до зловживань: - /
Ron Dahlgren

7
Криптичний синтаксис SBT виявляє найгірше в масштабі. Gradle ґрунтується на продуманій доменній моделі та синтаксисі прямого напряму.
nemoo

40

sbt - це Scala DSL, і для нього Scala є першокласним громадянином, тому в принципі це, здається, добре підходить.

Але sbt страждає від великих несумісних змін між версіями, через що важко знайти правильний робочий плагін для завдання та змусити його працювати.

Я особисто відмовився від sbt, оскільки це викликало більше проблем, ніж вирішувало. Я фактично перейшов на градле.

Піди розберися.


2
Наскільки я знаю, була лише одна дуже суттєва зміна: коли sbt перейшов з 0.7.x на 0.1.x
om-nom-nom

1
Якщо ви використовуєте плагін для sbt 0.11.2, а потім переходите до sbt 0,12, вам потрібно дочекатися, коли автор плагіна складе нову версію або зробіть це самостійно. idea-sbt - один із прикладів.
fmpwizard

4
@fmpwizard Рядок sbt 0,12 ще не вийшов ... Зупиніть поширення FUD.
парадигматичний

3
Це не sbt неможливо використовувати, наша команда використовує його. Але мій коментар повинен був підтримати цю відповідь, яка сказала "... Але sbt страждає від значних несумісних змін між версіями, через що важко знайти правильний робочий плагін для завдання і змусити його працювати ..." Як ви помітили , Я не можу просто використовувати плагін scct, мені довелося його модифікувати (так, невелика зміна, але тоді мені довелося десь опублікувати його, щоб вся моя команда могла отримати до нього доступ) Біль без поважних причин.
fmpwizard

3
Чи можете ви зробити перехресну компіляцію для різних версій Scala, використовуючи gradle?
Макісуджі

4

Я досить новачок в gradle, і дуже новий в sbt - що мені дуже подобається в sbt поки що - це інтерактивна консоль. Це дозволяє мені використовувати команди типу "перевірити", щоб краще зрозуміти, що відбувається. AFAIK gradle не надає такого типу атма.


-11

Обидва Sbt і gradle базуються на статично введених мовах .... але sbt має мало переваг:

  • краща підтримка плагінів, спеціально автоматичні додатки
  • створення завдань та управління залежностями між завданнями
  • sbt спеціально підходить для проектів scala в тому сенсі, що він підтримує поступові побудови, і більша частина самого sbt написана у масштабі scala, а визначення sbt build - у scala.
  • sbt має інтерактивну підтримку оболонки з багатьма корисними вбудованими завданнями
  • Життєвий цикл за замовчуванням sbt є досить корисним і може почати початківців із значно меншими зусиллями

1
Gradle ґрунтується на groovy, який не є статично набраною мовою.
Vistritium

Gradle робить управління залежністю між завданнями, це як можна простіше створити завдання, я не маю уявлення, як можна простіше написати плагін, ніж для gradle, який може приймати groovy, Java, додатки gradle і, можливо, більше.
Джонріда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.