我在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似乎不喜欢它。它在项目设置中设置了两个附加模块,如下所示:
当我尝试编译我的项目时,我收到以下错误:
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不创建这两个额外的模块?
谢谢
答案 0 :(得分:2)
这取决于您sbt
的版本,但至少在版本0.13.x
中,您可以使用project
macro,如下所示:
lazy val riepete = project.in( file(".") )
这样IntelliJ的想法就不会创建一个额外的模块。
你甚至可以把它作为你的build.sbt
。根据我在大多数情况下的经验,您可以维护一个简单的build.sbt
文件,尤其是最新版本的sbt
。无论如何,我想将它保存在一个地方是有道理的:build.sbt
或Build.scala
文件夹中的project
。
如果您的项目或子项目文件夹名称包含-
或其他字符,您可以随时使用后退标记,例如:
lazy val `riepete-project` = project
在这种情况下,您甚至不需要使用.in(file(....
,因为宏将根据模块的名称从正确的文件夹中选择文件。
答案 1 :(得分:0)
一种可能性是不使用IntellJ的SBT导入功能并使用sbt-idea插件生成其文件。请注意,您需要在SBT项目更改(依赖项添加/删除等)上重新运行它。
另一种方法是在导入SBT项目时关闭自动导入选项,然后删除IDEA项目结构对话框中的额外模块。