2016-06-11 3 views
2

Как я могу указать настраиваемый промежуточный каталог для многопроектной конфигурации? Я использую sbt-native-packagerScala SBT - 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: _*) 
+0

Была ошибка «Ссылки на неопределенные настройки» Настройки делая ссылку на 'StagingDirectory '? Знание того, какие настройки конкретно имеют проблемы, поможет. – metasim

+0

Да, удаление этой настройки позволило бы пройти сборку, но в стандартном месте размещения: 'target/universal/stage' –

ответ

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(...)) 

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

Смежные вопросы