Intellij sbt插件,项目定义在project / Build.scala中

时间:2014-10-17 14:31:27

标签: scala intellij-idea sbt

我在Intelli-j 13.1中使用了以下sbt项目结构

.
├── build.sbt
├── project
│   ├── Build.scala
│   ├── plugins.sbt
├── src
│   ├── main
│   └── test
└── target

我的built.sbt非常简单,我只是声明了一些依赖项。

我的project/Build.scala稍微复杂一点,它定义了一个新项目使用:

lazy val RiepeteKernel = Project(id =“riepete-kernel”,base = file(“。”),settings = defaultSettings)

Intellij似乎不喜欢它。它在项目设置中设置了两个附加模块,如下所示:

enter image description here

当我尝试编译我的项目时,我收到以下错误:

  Error:scalac: Output path /home/simao/code/riepete/project/target/idea-test-classes is shared between: 
  Module 'riepete-build' tests, Module 'riepete-kernel-build' tests Output path /home/simao/code/riepete/project/target/idea-classes 
  is shared between: Module 'riepete-build' production,
  Module 'riepete-kernel-build' production   Please configure separate output
  paths to proceed with the compilation.
  TIP: you can use Project Artifacts to combine compiled classes if needed.

由于我只需要我的额外项目在控制台上运行sbt dist,如果我删除了intellij创建的两个附加模块,那么每次重启intellij都需要这样做。

有没有办法让intellij不创建这两个额外的模块?

谢谢

2 个答案:

答案 0 :(得分:2)

这取决于您sbt的版本,但至少在版本0.13.x中,您可以使用project macro,如下所示:

lazy val riepete = project.in( file(".") )

这样IntelliJ的想法就不会创建一个额外的模块。

你甚至可以把它作为你的build.sbt。根据我在大多数情况下的经验,您可以维护一个简单的build.sbt文件,尤其是最新版本的sbt。无论如何,我想将它保存在一个地方是有道理的:build.sbtBuild.scala文件夹中的project

如果您的项目或子项目文件夹名称包含-或其他字符,您可以随时使用后退标记,例如:

lazy val `riepete-project` = project

在这种情况下,您甚至不需要使用.in(file(....,因为宏将根据模块的名称从正确的文件夹中选择文件。

答案 1 :(得分:0)

一种可能性是不使用IntellJ的SBT导入功能并使用sbt-idea插件生成其文件。请注意,您需要在SBT项目更改(依赖项添加/删除等)上重新运行它。

另一种方法是在导入SBT项目时关闭自动导入选项,然后删除IDEA项目结构对话框中的额外模块。