sbtとGradleの比較[終了]


110

私はScalaに飛び込んでいて、sbtに気づきました。私はjava / groovyプロジェクトでGradleに非常に満足しており、Gradle用のscalaプラグインがあることを知っています。

ScalaプロジェクトでGradleよりもsbtを支持する良い理由は何でしょうか?


SBTはある意味でVimのようなものです。それを手に入れれば、喜ぶでしょう。ちなみに、mavenとleinもあります(clojure用に作成されましたが、scalaでも動作します)。
om-nom-nom

18
SBTへの移行を迫られていると感じないでください。Scalaコミュニティの有名なメンバーのいくつかはGradleを使用しています。代わりに、SBTを実験として使用してください。代わりにGradleを使用することができます。
ダニエルC.ソブラル

6
おかげで...あなたの洞察を読んだら、私はGradleを使い続けます。Mavenを後にするときに、JVMスペースのビルドツールの取り組みのほとんどがここにあるように思えます。
Hans Westerbeek、2012年

10
この質問がここでは「意見ベース」としてマークされていることは、おそらくJVM空間で常に作業をしていない(したがって、監視が不足している)人々によって悩まされています。以下の答えは事実であり、聖戦主義の答えはありません。
Hans Westerbeek、2015

4
いいえ、それらの回答は主に意見ではなく、検証可能な事実の記述です。この質問役に立たない答えを引き付ける可能性がありますが、実際にはそうしていません。ツール間の実際の違いの有用な説明として、開いたままにする必要があります。
エリクソン

回答:


61

SBTとGradleの主な違いの1つは、依存関係の管理です。

  • SBTIvy。リビジョンは固定(たとえば、1.5.2)または最新(または動的)のいずれかで指定できます。
    Ivy Dependency」を参照してください。
    つまり、このスレッドMark Harrahが詳しく説明している場合でも、「-SNAPSHOT」メカニズムのサポートに問題がある可能性があります

キャッシュが混乱する可能性があることは事実ですが、Ivyがスナップショットの解決を理解していないことは事実ではありません。Eugeneはこの点について、おそらく管理者リストにある別のスレッドで説明しました。0.12で対処されたsbtの自動更新に問題があります。

私の知る限り、Ivyがサポートしていないのは、Mavenが行う方法でスナップショットを公開することです。私はこれを別の場所で述べたと思いますが、誰かが状況を改善したい場合、私の意見は、Gradleチームと協力して依存関係管理コードを再利用するのが最善であると考えています。

ただお知らせしておきますが、IdleとMavenのスナップショット依存関係の問題が、Gradleが最終的にIvyを独自の依存関係管理コードに置き換えた理由の1つでした。それは大きな仕事でしたが、多くのメリットをもたらしました。

このツイートは、すべての状況が将来進化する可能性があることを述べています。

マークは以前、SBTにIvyではなくGradleを使用することに興味があったと述べました。

(両方のツールは互いに学ぶことができます


1
私が今まで遭遇した最も不便な点はsbtであり、それが言及されるたびに再コンパイルしないルールを指定できなかったということです。JavaとScalaの組み込みルールにはこの機能がありますが、カスタムルールを作成するために公開されていません。そのため、プログラムファイルまたはドキュメントを生成するたび、およびjarファイルを生成した場合でも、ソースへの変更が実際に行われたかどうかに関係なく、タスクは呼び出しごとに実行されます。でも、メイクはスマート十分ではなく、SBT
ayvango

1
@ayvango今日のsbtはそうではありません。android-sdk-pluginの
dant3

その機能にどのAPIが使用されているか知っていますか?
ayvango 2015年

だからこれはアイビーがmavenとgradleの両方と比較すると欠けているものですか?それは奇妙なことです
三倍体

53

私にとって、SBTの主な機能は次のとおりです。

  • 高速コンパイル(より高速fsc)。
  • 継続的なコンパイル/テスト:コマンド~testは、変更を保存するたびにプロジェクトを再コンパイルしてテストします。
  • 複数のscalaバージョンにまたがるクロスコンパイルおよびクロスパブリッシング。
  • 正しいscalaバージョンの互換性を持つ依存関係を自動的に取得します。

欠点は次のとおりです。

  • 新規ユーザーを落胆させる傾向がある象形文字構文(特にJavaを使用している場合)
  • 「タスク」を定義する簡単な方法はありません。特別なビルド手順が必要な場合は、プラグインを見つけるか、自分でプラグインを作成する必要があります。

Scalaが後方バイナリーの非互換性で抱えていた問題のために、クロスコンパイル/パブリッシング機能が必要であったことは正しいのでしょうか?
Hans Westerbeek、2012年

1
はい。また、Scala 2.10に移行すると、これらの問題が再び発生する可能性があります。
パラダイム的

1
さらに2つの違いを追加します。* SBTでは、依存関係をIMOで自己管理する方が簡単です。* SBTテストランナーはより高速に見えます。ここにはいくつかのずるがしこい並行性があると思いますが、私は推測しています。SBTは、より有能ですが、成熟度が低い製品のようです。
Rick-777

25
+1は、「象形文字構文」のマイナス面です。それがSBTに対する私の最大の不満です。オペレーターの過負荷は常に虐待につながります:-/
Ron Dahlgren

7
不可解なSBT構文は、scalaで最悪のものを引き出します。Gradleは、よく考えられたドメインモデルと単純な構文に基づいています。
nemoo 2013年

40

sbtはScala DSLであり、そのためScalaは一流の市民であるため、原則としてそれは適切だと思われます。

しかし、sbtはバージョン間の大きな互換性のない変更に悩まされています。そのため、タスクに適切に機能するプラグインを見つけてそれを機能させるのは困難です。

私が個人的にsbtをあきらめたのは、それが解決した以上の問題を引き起こしていたからです。実際にgradleに切り替えました。

図を行きます。


2
私の知る限り、非常に大きな変更が1つだけありました。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
Gradleを使用して、異なるScalaバージョンのクロスコンパイルを実行できますか?
町筋2014

4

Gradleはかなり新しく、sbtは非常に新しいです。今のところsbtで本当に気に入っているのは、インタラクティブコンソールです。'inspect'のようなコマンドを使用して、何が起こっているのかをよりよく理解することができます。AFAIKグラドルは、このATMのようなものを提供していません。


-11

SBTとGradleはどちらも静的に型付けされた言語に基づいていますが、SBTにはいくつかの利点があります。

  • より良いプラグインのサポート、特にオートプラグイン
  • タスクの作成とタスク間の依存関係の管理
  • sbtは、インクリメンタルビルドをサポートし、sbt自体のほとんどがscalaで記述され、sbtビルド定義がscalaで記述されるという意味で、scalaプロジェクトに特に適しています。
  • sbtは多くの便利な組み込みタスクを備えた対話型シェルをサポートしています
  • sbtのデフォルトのライフサイクルはかなり便利で、初心者はかなり少ない労力で始められます

1
Gradleは、静的に型付けされた言語ではないgroovyに基づいています。
Vistritium 2016年

Gradleはタスク間の依存関係管理を行います。タスクを作成することはできるだけ簡単です。groovy、Java、gradleプラグインなどを使用できるgradleよりもプラグインを作成する方が簡単であるとは思いません。
Johnride、2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.