如何为scala项目同步Intellij和sbt构建

use*_*074 7 scala intellij-idea sbt

我有一个我导入Intellij的sbt项目.有时我使用sbt在命令行构建项目,然后当我需要调试时,我在Intellij中构建它.但是,每次我替换它都需要在没有需要时进行完全重建.两个构建过程都输出到同一个类文件夹,即.../target/scala-2.11/classes,所以我不明白为什么完全重建会继续发生?

Juh*_*uh_ 6

正如 CrazyCoder 所说,intellij 和 sbt build 都有自己的跟踪更改文件的增量构建。因此,每次重新编译文件时,另一个将其视为更改的文件并重新编译它。

虽然CrazyCoder的答案介绍如何使分隔的目录他们的工作,通过改变SBT编译的类目录。这个答案解释了如何配置 Intellij 以将 sbt 用于所有构建,因此只有 sbt 进行编译。这是一个相对较新的功能。

只需检查选项:

file
  > Settings
    > Build, Execution, Deployment
      > Build Tools
        > SBT 
          > Use SBT shell for build and import
Run Code Online (Sandbox Code Playgroud)

它至少从 Intellij 版本 2017.2.3 开始工作,并且很可能它是 SBT 插件中的一个选项。

有关此功能的详细信息,请参阅 jetbrains 票证:https ://youtrack.jetbrains.com/issue/SCL-10984


Cra*_*der 5

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")
Run Code Online (Sandbox Code Playgroud)

以下是自定义 IDE 输出目录的方法build.sbt

ideOutputDirectory in Compile := Some(new File("target/idea/classes"))
ideOutputDirectory in Test := Some(new File("target/idea/test-classes"))
Run Code Online (Sandbox Code Playgroud)

根据您的需要随意更改路径。