モジュールconfig
を作成し、各環境ごとに別々のサブモジュールを作成することで問題を解決することができました。そのため、プロジェクトの構造は問題のとおりです。 build.sbt
ではすべてが適切な設定になります。
以下は、私が望むことを達成するために行ったことの一般的な考え方です。
lazy val config = (project in file("config")).
enablePlugins(UniversalPlugin).
settings(
name := "my-project",
version := "1.1",
publish in Universal := { }, // disable publishing of config module
publishLocal in Universal := { }
).
aggregate(configDev, configUat, configProd)
lazy val environment = settingKey[String]("Target environment")
lazy val commonSettings = makeDeploymentSettings(Universal, packageBin in Universal, "zip") ++ Seq( // set package format
name := "my-project-config",
version := "1.1",
environment := baseDirectory.value.getName, // set 'environment' variable based on a configuration folder name
topLevelDirectory := None, // set top level directory for each package
packageName in Universal := s"my-project-config-${environment.value}-${version.value}", // set package name (example: my-project-config-dev-1.1)
mappings in Universal ++= contentOf(baseDirectory.value).filterNot { case (_, path) => // do not include target folder
path contains "target"
}
)
lazy val configDev = (project in file("config/dev")).enablePlugins(UniversalPlugin).settings(commonSettings: _*)
lazy val configUat = (project in file("config/uat")).enablePlugins(UniversalPlugin).settings(commonSettings: _*)
lazy val configProd = (project in file("config/prod")).enablePlugins(UniversalPlugin).settings(commonSettings: _*)
UniversalPluginは高度に構成可能ですが、最初はすべての設定オプションが明確ではない場合があります。私はそのドキュメントを読んで、ソースコードを調べることをお勧めします。
sbt config/universal:packageBin
出版:実際には次のコマンドが発行された成果物パッケージへ
sbt config/universal:publish
を新しい環境を追加する上で見ることができるようには非常に簡単です - 唯一の新しいフォルダと1つのラインbuild.sbt
を追加する必要があります。