Дистрибутивы для конкретных сред с использованием собственного упаковщика sbt

Я пытаюсь создать/настроить дистрибутивы для конкретной среды (для разработки, качества и производства), используя собственные функции упаковщика sbt, доступные в Play (2.2). Я попытался добиться этого, используя следующие настройки в файле build.sbt:

val dev  = config("dev")  extend(Universal)
val qual = config("qual") extend(Universal)
val prod = config("prod") extend(Universal)


def distSettings: Seq[Setting[_]] =
  inConfig(dev)(Seq(
    mappings in Universal <+= (resourceDirectory in Compile) map { dir =>
     println("dev")
     (dir / "start.bat.dev") -> "bin/start.bat"
     // additional mappings
   }
  )) ++
  inConfig(qual)(Seq(
    mappings in Universal <+= (resourceDirectory in Compile) map { dir =>
      println("qual")
      (dir / "start.bat.qual") -> "bin/start.bat"
      // additional mappings
    }
  )) ++
  inConfig(prod)(Seq(
    mappings in Universal <+= (resourceDirectory in Compile) map { dir =>
      println("prod")
      (dir / "start.bat.prod") -> "bin/start.bat"
      // additional mappings
    }
  ))


play.Project.playScalaSettings ++ distSettings

В консоли SBT, когда я набираю «dev:dist», я ожидал увидеть только «dev» в качестве вывода и, соответственно, использовать только соответствующие сопоставления. Вместо этого похоже, что все сопоставления во всех конфигурациях объединены. Скорее всего я не понимаю, как должны работать конфиги в SBT. Кроме того, могут быть лучшие подходы, которые достигают того, что я ищу.


person Martin Studer    schedule 12.12.2013    source источник
comment
Примечание. Этот вопрос уже публиковался на groups.google.com/forum/ #!topic/play-framework/gdTv_hPxBq0, но я решил, что в данном случае лучше подойдет SO.   -  person Martin Studer    schedule 12.12.2013


Ответы (1)


inConfig(c)( settings ) означает использование c в качестве конфигурации, если она явно не указана в settings. В примере конфигурация для mappings указана как Universal, поэтому все сопоставления добавляются к конфигурации Universal, а не к более конкретной.

Вместо этого выполните:

inConfig(prod)(Seq(
  mappings <+= ...
))

То есть удалить часть in Universal.

Примечание. Поскольку более конкретные конфигурации, такие как prod, расширяют Universal, они включают сопоставления из Universal.

person Mark Harrah    schedule 13.12.2013
comment
Да я вижу. Однако, если я это сделаю, теперь я получаю сообщение об ошибке «Ссылки на неопределенные настройки: ‹project›/prod:mappings from ‹project›/prod:mappings (то же самое для dev:mappings и qual:mappings). - person Martin Studer; 19.12.2013