我有一个导入Intellij的sbt项目。有时我使用sbt在命令行构建项目,然后当我需要调试时,我在Intellij中构建它。但是,每次我替换它都需要在没有需要时进行完全重建。两个构建过程都输出到同一个类文件夹,即... / target / scala-2.11 / classes,所以我不明白为什么要完全重建?
答案 0 :(得分:4)
正如CrazyCoder所说,intellij和sbt build每个都有自己跟踪已更改的文件以进行增量构建。因此,每次重新编译一个文件时,另一个文件将其视为已更改的文件并重新编译它。
虽然CrazyCoder's answer描述了如何使它们在分离的目录上工作,但是通过更改sbt编译的类dir。这个答案解释了如何配置Intellij使用sbt进行所有构建,因此只有sbt才能进行编译。这是一个相对较新的功能。
只需选中选项:
file
> Settings
> Build, Execution, Deployment
> Build Tools
> SBT
> Use SBT shell for build and import
至少从intellij版本2017.2.3开始,它很可能是SBT插件中的一个选项。
有关此功能的详细信息,请参阅jetbrains ticket:https://youtrack.jetbrains.com/issue/SCL-10984
答案 1 :(得分: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"))
根据您的需要随意更改路径。