Найти корневой каталог главного проекта в мультипроекте 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,

Другие вопросы по тегам