在sbt多项目中查找主项目根目录

时间:2018-12-20 22:36:43

标签: sbt multi-project

是否可以在多项目sbt文件中从子项目引用主项目? 我正在编写一个自定义任务,我需要找到两个目录:

  • 来自主项目:baseDirectory
  • 来自子项目:目标

当然,每一个都可以在自己的项目中使用。但是我需要以相同的代码访问它们。 我该怎么办?

项目布局为:

some/dir/build.sbt
    val masterRoot = baseDirectory.value.getAbsolutePath // this works
    lazy val root = (project in file(".")).aggregate(subproject)
some/dir/subproject/build.sbt
    lazy val someTask = TaskKey[String]("someTask")
    someTask := {
        val subprojectTarget = target.value.getAbsolutePath // this works
        val masterRootBroken = baseDirectory.in(root).value.getAbsolutePath // root is not found
        // I need access to subprojectTarget AND masterRoot here
    }

或者,我可以在主项目的图形中将值设置到SettingKey中,然后在子项目中读取它吗?

1 个答案:

答案 0 :(得分:0)

我认为有两种选择

第一个选择是您已经拥有的多文件项目结构

build.sbt

val sub = (project in file("sub"))
val root = (project in file("."))

注意:以上所有行都不是必需的。定义它们只是为了表示一些可能的附加逻辑,例如aggregate

还有sub/build.sbt和内容

val root = (project in file("..")) //Note that ".." is used to refer to root project folder
val combinedPath = TaskKey[String]("combinedPath")
combinedPath := {
  target.value.getAbsolutePath + baseDirectory.in(root).value.getAbsolutePath
}

第二个是将所有build.sbt文件合并到一个包含内容的根项目中的build.sbt

val combinedPath = TaskKey[String]("combinedPath")
val sub = (project in file("sub"))
  .settings(
    combinedPath := {
      target.value.getAbsolutePath + baseDirectory.in(root).value.getAbsolutePath
    }
  )
lazy val root = (project in file("."))

任务combinedPath的定义是在settings项目的sub中完成的,它可以引用baseDirectory.in(root)的{​​{1}}。