Расширение универсальной конфигурации в sbt-native-packager

Я работаю с sbt 0.13.8 и sbt-native-packager 1.0.3.

Я хотел бы настроить конфигурацию упаковки для разработки и производства с различными параметрами Java. Идея заключается в создании архива пакетов через UniversalPluguin из sbt-native-packager : "universal:packageZipTarball". Я также использую архетип "JavaServerAppPackaging".

Я пробовал это Build.scala:

import sbt._
import Keys._
import com.typesafe.sbt.packager.universal.UniversalPlugin.autoImport._
import com.typesafe.sbt.packager.archetypes.JavaServerAppPackaging

object Build extends Build {

  lazy val commonSettings: Seq[Setting[_]] = Seq(
    scalaVersion := "2.11.7",
    crossScalaVersions := Seq("2.11.7"),
    scalacOptions in Compile ++= Seq( "-unchecked", "-feature", "-language:postfixOps", "-deprecation" )
  )

  lazy val devConfig = config("dev") extend Universal
  lazy val prodConfig = config("prod") extend Universal

  lazy val root = (project in file("."))
    .settings(commonSettings : _*)
    .enablePlugins(JavaServerAppPackaging)
    .configs(devConfig, prodConfig)
    .settings(
      javaOptions in devConfig ++= Seq(
        // -J params will be added as jvm parameters
        "-J-Xmx384m",
        "-J-Xss512k"),
      javaOptions in prodConfig ++= Seq(
        // -J params will be added as jvm parameters
        "-J-Xmx384m",
        "-J-Xss740k")
    )
}

С этой настройкой SBT продолжает давать сбой:

Error:Error while importing SBT project:
...
at sbt.Classpaths$$anonfun$updateTask$1.apply(Defaults.scala:1310)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon$4.work(System.scala:63)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
at sbt.Execute.work(Execute.scala:235)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
at sbtConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[error] java.text.ParseException: unknown configuration 'universal'. It is extended by dev in null
[error] Use 'last' for the full log.

See complete log in /Users/ivan/Library/Logs/IdeaIC14/sbt.last.log

Я поддерживаю идею создания двух упакованных архивов для разработки с помощью команды sbt "dev:packageZipTarball" и для производства с помощью "prod:packageZipTarball" с различными параметрами jvm.

Любые идеи, почему я не могу расширить конфигурацию «universal» с помощью пользовательских конфигураций для достижения этого или альтернатив этому подходу?


person Ivan L.    schedule 26.10.2015    source источник


Ответы (1)


Я настоятельно рекомендую не расширять конфигурации. Поведение не ожидаемое. Лучший способ добиться различных конфигураций сборки — создать подмодули для каждой конфигурации.

См. этот ответ, в котором более подробно объясняется, как создавать подпроекты с различными конфигурациями.

person Muki    schedule 27.10.2015
comment
Отличный совет!. Теперь я могу выполнить dev/universal:packageZipTarball или prod/universal:packageZipTarball, и это работает как шарм. Спасибо @Muki - person Ivan L.; 28.10.2015
comment
В моем случае у меня есть сложное приложение, состоящее из 75 модулей и большого количества унаследованного кода, который я не могу легко разделить на отдельные модули. В моем случае я должен найти способ заставить его работать. Так что, несмотря на то, что ваши аргументы и рекомендации имеют большой смысл, они не могут помочь в моем случае. - person Richard Gomes; 12.02.2016
comment
Конечно, вы можете использовать области конфигурации, но они менее интуитивно понятны и их сложнее отлаживать. - person Muki; 13.02.2016