web-dev-qa-db-ja.com

IntelliJ上のSBTの更新には非常に長い時間がかかります

かなり大きなプロジェクト(15以上のサブプロジェクト)があり、外部依存関係がたくさんあります。 build.sbtの1行でも変更してから更新を押すと、IntelliJはさまざまな依存関係を非常に長い時間(30分以上)解決し続けます。

これは遅いのでしょうか?コマンドラインからsbtを使用しても、30秒ほどかかりません。

使っています -

Macbook pro mid 2015 with 16 GB ram
IntelliJ IDEA Ultimate 2017.2.5
sbt 0.13.13 
scala 2.11.11
13
Kakaji

@ y.bedrovの提案に従ってIntelliJ内でSBTシェルを有効にしたところ、更新がコマンドラインと同じくらい高速になりました。

[設定]> [ビルド、実行、配置]> [ビルドツール]> [SBT]> [ビルドとインポートにSBTシェルを使用する]をオンにします。

3
Kakaji

役立つ1つのことは、キャッシュされた依存関係の解決です。これは、sbt 0.13.7以降で利用可能な設定です。ここを見てください: http://www.scala-sbt.org/1.0/docs/Cached-Resolution.html ですが、基本的に、以下の設定を、ビルド:

updateOptions := updateOptions.value.withCachedResolution(true)

この設定により、IntelliJプロジェクトの更新時間を15分から3分に短縮できました。まだ理想的ではありませんが、管理ははるかに簡単です。

実験的な設定なので、いくつかの注意点があります。それらはそのページで説明されています。基本的に、SNAPSHOT依存関係がある場合、これを有効にしても事態は悪化するだけなので、そのことを意識してください。

6
Haspemulator

KakajiとHaspemulatorの回答により、〜40のプロジェクトビルドでインポートを最大3分まで短縮できました。それに加えて、IntelliJ SBTインポートのほとんどの時間は、updateClassifiersコマンドの一部としてIvyから依存関係をフェッチすることに費やされていることがわかりました。

これは、プロジェクトをインポートするときに「ライブラリソース」チェックボックスをオンにしている場合、インポートを実行するたびに発生します。 'sbt sources'もチェックすると遅くなると思います。解決するライブラリが増えるからです。

updateClassifiersを高速化する1つの方法は、依存関係の解決に coursier を使用することです。 project/plugins.sbtに次の行を追加したところ、約1分でインポートされます。

addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.1")

遅い[updateClassifiers]についての詳細は https://github.com/sbt/sbt/issues/19 で読むことができます

5
fedeoasi

上記の2つの組み合わせを使用しています(-[設定]> [ビルド、実行、デプロイメント]> [ビルドツール]> [SBT]> [ビルドとインポートにSBTシェルを使用する]をオンにします)-クーリエ

次のグローバルbuild.sbtを使用します。

    // file: ~/.sbt/0.13/plugins/build.sbt
    // purpose: add jar utils useful for development, but not wanted to projects' build.sbt

    // much better depts resolvement and fetching
    // usage: sbt update
    // https://github.com/coursier/coursier#why
    resolvers += Resolver.sonatypeRepo("snapshots")
    addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.1.0-SNAPSHOT")


    // enable this one if you want to use the local artifacts in your local repo's
    // ~/.ivy2/local/
    // ~/.ivy2/cache/
    // instead of the remote ones
    // updateOptions := updateOptions.value.withLatestSnapshots(false)


    resolvers ++= Seq(
       "typesafe" at "https://dl.bintray.com/typesafe/ivy-releases/",
       "Maven External Releases" at "https://artifactory-espoo1.ext.net.nokia.com/artifactory/public-maven-remotes/"
    )


    // eof file: ~/.sbt/0.13/plugins/build.sbt
1
Yordan Georgiev