我正在使用sbt进行多项目构建,如下所述:
http://www.scala-sbt.org/0.13/tutorial/Multi-Project.html
这是顶级build.scala文件:
import sbt._
import Keys._
object ExampleBuild extends Build {
lazy val scrooge = Project(
id = "scrooge",
base = file("messages-scrooge")
)
lazy val examples = Project(
id = "examples",
base = file("examples")
).dependsOn(scrooge)
}
我想更改目标目录,以便所有输出都转到一个单独的分区。*以下似乎工作但是非常笨重,因为我需要为每个子项目单独更改它。如果有更多的东西,情况会变得更糟:
target="$HOME/sbt-target"
sbt "project scrooge" "set target := new java.io.File(\"$target/scrooge\")" "project examples" "set target := new java.io.File(\"$target/examples\")" "project root" clean assembly
我更喜欢做更像下面这样的事情,但是在“examples”项目试图导入类型的地方,它无法编译大量关于“对象blah不是包的成员......”的消息来自“scrooge”项目。我认为这是因为两个项目都在踩着彼此的输出文件。
target="$HOME/sbt-target"
sbt "set every target := new java.io.File(\"$target\")" clean assembly
有更好的方法吗?我不介意更改构建文件,但我不希望在其中包含任何硬编码路径。
* - 我想更改输出目录的原因是我在Vagrant VM中构建,并且使用从Windows主机到Linux VM的Virtualbox共享文件夹共享源文件夹。 Scala编译器尝试创建一些超过Windows 260字符路径限制的超长文件名。如果你坚信我会以不同的方式更好地解决这个问题,请告诉我,我会发布一个单独的问题,但我已经在这方面遇到了很多问题,因此我希望只需更改目标目录。
答案 0 :(得分:0)
我用一个插件来做。就我而言,我尝试合并所有target/
文件夹(不冲突):
package sbt
package plugins
/** [[PluginOptimizedLayout]] is an [[AutoPlugin]] that consolidates `target/` folders under the root `target/`.
*
* This removes noise when navigating the source folders; and enables elision of `src/`.
*/
object PluginOptimizedLayout extends AutoPlugin {
import Keys._
override def requires = JvmPlugin
override def trigger = allRequirements
override lazy val projectSettings = Seq(
target := {
(ThisBuild / baseDirectory).value / "target" / thisProject.value.id
}
)
}