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



是否可以在多项目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中设置一个值,然后在子项目中读取它吗?

我认为有两种选择

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

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的定义是在sub项目的settings中完成的,可以参考rootbaseDirectory.in(root)

最新更新