2017-07-22 7 views
6

私はIntellijにインポートしたsbtプロジェクトを持っています。時々私はsbtを使ってコマンドラインでプロジェクトをビルドし、デバッグが必要なときにIntellijからビルドします。しかし、私が交替するたびに、必要がないときに完全に再構築する必要があります。両方のプロシージャを同じクラスフォルダ、つまり.../target/scala-2.11/classesに出力するので、なぜ完全なリビルドが起こるのか理解できません。Intellijとsbtビルドをスカラプロジェクトに同期させる方法

答えて

3

IntelliJ IDEAは依存関係を追跡し、変更を行ったときに変更されたファイルと依存するファイルのみをコンパイルできるように、コンパイル時にキャッシュを構築する独自のインクリメンタルコンパイラを備えているため、コード。 SBT/Maven/Gradleまたはコマンドラインjavacを使用してビルドした場合、IntelliJ IDEAコンパイラキャッシュは変更されたファイルとコンパイルするファイルを知らないため、完全な再構築を実行します。

解決策は、IDEとSBTに異なる出力ディレクトリを使用することです。この方法でIntelliJ IDEAはIDEで最後にビルドされてから変更されたファイルのみを再構築し、コマンドラインSBTビルドはIDEで再構築をトリガーしません。

この設定は、sbt-ide-settingsプラグインを使用して実行されます。

plugins.sbtに次を追加します(またはあなたがプラグインを構成するものは何でもファイル):

resolvers += Resolver.url("jetbrains-bintray",url("http://dl.bintray.com/jetbrains/sbt-plugins/"))(Resolver.ivyStylePatterns) 
addSbtPlugin("org.jetbrains" % "sbt-ide-settings" % "0.1.2") 

そして、ここではbuild.sbtでIDEの出力ディレクトリをカスタマイズする方法である:

ideOutputDirectory in Compile := Some(new File("target/idea/classes")) 
ideOutputDirectory in Test := Some(new File("target/idea/test-classes")) 

が気軽必要に応じてパスを変更してください。

+0

のIntelliJの設定は、(私が推測するのsbtプラグインを使用して)SBTから輸入されています。次のリフレッシュ後に新しいターゲットディレクトリの使用を開始しませんか? –

+0

テスト出力ディレクトリが無視されるため、これは機能しません。だからあなたのコードを実行しようとするとエラーが発生します "生産とテストの出力パスが破られています:..."(私はIntellij 2017 3.3を使用しています) – gbasler

3

CrazyCoderで述べたように、intellijとsbtのビルドでは、それぞれインクリメンタルビルドのための変更されたファイルのトラッキングがあります。したがって、ある人がファイルを再コンパイルするたびに、もう一方は変更されたファイルとして扱い、再コンパイルします。

CrazyCoder's answerは、sbtコンパイルされたクラスdirを変更することによって、それらを分離されたディレクトリで動作させる方法を説明しています。この回答は、すべてのビルドにsbtを使用するようにIntellijを設定する方法を説明しています。したがって、sbtだけがコンパイルを行います。これは比較的新しい機能です。

だけでオプションを確認してください。

file 
    > Settings 
    > Build, Execution, Deployment 
     > Build Tools 
     > SBT 
      > Use SBT shell for build and import 

これは、バージョン2017年2月3日のIntelliJのため、少なくとも動作し、おそらくそれは、SBTプラグインからオプションです。この機能の詳細については

、JetBrainsのチケットを参照してください。https://youtrack.jetbrains.com/issue/SCL-10984