覆盖sbt多项目构建的输出目录

Wee*_*ble 5 sbt

我正在将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)
}
Run Code Online (Sandbox Code Playgroud)

我想更改目标目录,以便所有输出都进入一个单独的分区。*以下内容似乎可行,但确实很笨拙,因为我需要为每个子项目分别更改它。如果有更多的话,情况只会变得更糟:

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
Run Code Online (Sandbox Code Playgroud)

我更喜欢执行以下操作,但是在“示例”项目试图从“导入”中输入类型的地方,它无法编译出许多有关“对象不是包的成员...”的消息。 scrooge”项目。我认为这是因为两个项目都踩着对方的输出文件。

target="$HOME/sbt-target"
sbt "set every target := new java.io.File(\"$target\")" clean assembly
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?我不介意更改构建文件,但我不希望在其中没有任何硬编码的路径。

*-我要更改输出目录的原因是我在Vagrant VM中进行构建,并且使用Virtualbox共享文件夹将源文件夹从Windows主机共享到Linux VM。Scala编译器尝试创建一些非常长的文件名,这些文件名超过Windows 260字符路径限制。如果您坚信我最好尝试以其他方式解决此问题,请告诉我,我将发布一个单独的问题,但是我已经朝着这个方向遇到了很多问题,因此我希望只需更改目标目录。

Jef*_*era 1

我用一个插件来做这个。就我而言,我尝试合并所有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
    }
  )
}
Run Code Online (Sandbox Code Playgroud)