Найти корневой каталог главного проекта в мультипроекте sbt - PullRequest
0 голосов
/ 21 декабря 2018

Можно ли ссылаться на главный проект из подпроекта в многопроектном файле 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 голосов
/ 22 декабря 2018

Я думаю, что вам доступны две опции

Первый вариант - это многофайловая структура проекта, которая у вас уже есть

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.

...