Scala SBT - sbt-native-packager, как указать собственный каталог сцены

Как я могу указать настраиваемый промежуточный каталог для конфигурации нескольких проектов? Я использую sbt-native-packager

Ниже приведен эскиз моей многомодульной конфигурации. Когда я готовлю этот проект (sbt stage), файлы записываются в

common/target/universal/stage
app1/target/universal/stage
app2/target/universal/stage

Я хочу передать переменную env stageSuffix вот так: sbt stage -DstageSuffix=XYZ. Эта переменная должна сделать так, чтобы проект размещался в следующих каталогах:

common/target/universal/stage-XYZ
app1/target/universal/stage-XYZ
app2/target/universal/stage-XYZ

Я пробовал изменить stagingDirectory в commonSettings, но это не совсем работает, возникают ошибки типа «Ссылки на неопределенные настройки».

Как я могу заставить это работать?

val stageSuffix = sys.props.getOrElse("stageSuffix", ".")

val commonSettings = Seq(
  stagingDirectory := stagingDirectory.value / stageSuffix, // this makes it fail
  libraryDependencies ++= Seq(...))

val common = project.in(file("common"))
  .enablePlugins(JavaAppPackaging)
  .settings(commonSettings: _*)

val app1 = project.in(file("app1"))
  .enablePlugins(JavaAppPackaging)
  .settings(mainClass in Compile := Some("app1.Main"))
  .dependsOn(common)
  .settings(commonSettings: _*)
  .settings(libraryDependencies ++= Seq(...))

val app2 = project.in(file("app2"))
  .enablePlugins(JavaAppPackaging)
  .settings(mainClass in Compile := Some("app2.Main"))
  .dependsOn(common)
  .settings(commonSettings: _*)
  .settings(libraryDependencies ++= Seq(...))

val main = project.in(file("."))
  .dependsOn(common, app1, app2)
  .aggregate(common, app1, app2)
  .settings(commonSettings: _*)

person ak.    schedule 11.06.2016    source источник
comment
Была ли ошибка Ссылки на неопределенные настройки параметров ссылки на stagingDirectory? Знание, в каких настройках конкретно возникли проблемы, поможет.   -  person metasim    schedule 14.06.2016
comment
Да, удаление этого параметра позволит выполнить сборку, но в стандартном промежуточном местоположении: target/universal/stage   -  person ak.    schedule 15.06.2016


Ответы (1)


Мне удалось заставить его работать так:

val stagingDirectoryOverrideOpt = sys.props.get("stageSuffix").map { stageSuffix =>
  stagingDirectory in Universal := {
    val stageFile = (stagingDirectory in Universal).value
    new File(stageFile.getParentFile, s"stage-$stageSuffix")
  }
}

val app1 = project.in(file("app1"))
  .enablePlugins(JavaAppPackaging)
  .settings(mainClass in Compile := Some("app1.Main"))
  .dependsOn(common)
  .settings(commonSettings: _*)
  .settings(stagingDirectoryOverrideOpt.toSeq: _*)
  .settings(libraryDependencies ++= Seq(...))

Надеюсь, есть способ сделать его красивее

person ak.    schedule 17.06.2016