Найти корневой каталог главного проекта в мультипроекте 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 на графике в мастер-проекте и прочитать его в подпроекте?
1 ответ
Я думаю, что есть два варианта для вас
Первый вариант - многофайловая структура проекта, которая у вас уже есть
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)
из root
,