是否可以在多项目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
中完成的,可以参考root
的baseDirectory.in(root)
。