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

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

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

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

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

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

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

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

  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不创建这两个额外的模块?

谢谢

最佳答案 这取决于您的sbt版本,但至少在版本0.13.x中,您可以像这样使用
project macro

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

这样IntelliJ的想法就不会创建额外的模块.

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

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

lazy val `riepete-project` = project

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

点赞