这个sbt文件有什么问题?

时间:2014-09-16 21:52:50

标签: scala intellij-idea sbt intellij-13

当我将SBT项目导入intelliJ时,build.sbt文件显示了很多错误,如下面的屏幕截图所示。想知道可能是什么问题

IDEA版本 13.1.4

我也看到以下

The following source roots are outside of the corresponding base directories:
C:\Users\p0c\Downloads\recfun\src\main\resources
C:\Users\p0c\Downloads\recfun\src\test\java
C:\Users\p0c\Downloads\recfun\src\test\scala
C:\Users\p0c\Downloads\recfun\src\test\resources
These source roots cannot be included in the IDEA project model. Please consider using shared SBT projects instead of shared source roots.

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为这个问题或许没有提供所有必要的信息来最终回答,但我还是会给它一个旋转 -

由于sbt在从shell调用时运行正常,我们知道sbt文件没问题。我为我的Scala和sbt项目使用Idea,我确信Idea sbt支持非常有效,但是!在项目结构方面,理念比sbt更具限制性。创建一个Idea无法很好地支持的有效sbt项目结构非常容易。

鉴于源根错误表明recfun / src文件夹不在项目文件夹中,很明显在处理recfun / build.sbt期间不会发出此错误。屏幕截图显示您至少有三个不同的sbt文件,progfun-recfun,submission和scala-recfun。由于Idea还会创建像submission-build这样的项目,并且你在那里有一个赋值构建项目,项目结构可能会破坏某些东西,而不是从sbt的观点来看 - 你可以很好地构建 - 但是从理念观点,更具限制性。

我建议解决此问题的方法是更改​​项目结构,如下所示。首先,拥有一个带有build.sbt的顶级项目。然后为您想要的每个src文件夹创建一个子项目。不要在顶级项目中放置src文件夹。每个子项目也需要build.sbt。

其次,从shell运行时,确保子项目与sbt正确构建。使用以下语法排列具有适当依赖关系的子项目build.sbt文件:

lazy val a = ProjectRef(file("../a"), "a")
lazy val b = ProjectRef(file("../b"), "b")
lazy val root = Project(id = "c", base = file(".")) dependsOn (a, b)

(此示例有三个姐妹项目 a b c ,其中 c 依赖于 a b 。这三个项目放在根目录下的同名目录中。代码片段来自 c 的构建文件。)

第三,安排顶级build.sbt聚合子项目,使用顶级build.sbt中的语法:

lazy val a = ProjectRef(file("a"), "a")
lazy val b = ProjectRef(file("b"), "b")
lazy val c = ProjectRef(file("c"), "c")

lazy val root = (project in file(".")).
  aggregate(a, b, c)

构建此顶级项目将构建每个子项目 a b c ,以及在子项中建立的依赖项 - 项目构建文件将确保它们以正确的顺序构建。

第四,将顶级项目导入Idea,一切都应该很好。

如果需要,您可以使用文件结构,因为项目引用使用相对路径,但它通常很好,至少开始简单。

我在开始时对sbt和Idea感到非常沮丧,我希望这会有所帮助:)