我在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(文件(….因为宏将根据模块的名称从正确的文件夹中选择文件.