sbt assemlby実行時にリソースフォルダを変更できるようにしたい

まずデフォルトのリソースフォルダを変更してみる

sbt assemblyで実行可能jarを作成する際通常は"src/main/resources"がリソースフォルダとして使われますが、build.sbtにresourceDirectory in Compileの設定をすることによりデフォルトのリソースフォルダを変更することができます。以下では標準のリソースフォルダがsrc/main/resources/developmentになるように変更しています。

lazy val app = (project in file(".")).
  settings(assemblySettings: _*).
  settings(resourceDirectory in Compile := baseDirectory.value / "src" / "main" / "resources" / "development")

sbt assembly実行時に動的にリソースフォルダを変更してみる

例えば以下のようなフォルダの構成でリソースフォルダをビルド時に変更したい場合

src/main/resources
            ├── development: 開発時に使用するリソース
            ├── production: 本番環境リリース時のリソース
            └── staging: ステージ環境リリース時のリソース

この場合、最初はresourceDirectoryを変更するタスクを作ってassemblyと連続して呼び出せば大丈夫なのかと思ったのですがタスク間ではresourceDirectoryの変更などの副作用が起きないような動きをしていて困ったのですが、sbtにはaddCommandAliasというものがあり事前にset resourceDirectory in Compileすれば大丈夫そうでした。結果ですが以下のbuild.sbtの設定ではsbt assemblyではデフォルトのリソースフォルダをsbt prodEnvAssemblyではproduction環境のリソースフォルダをsbt stgEnvAssemlbyではstaging環境のリソースフォルダを使うようになります。

lazy val app = (project in file(".")).
  settings(resourceDirectory in Compile := baseDirectory.value / "src" / "main" / "resources" / "development")

addCommandAlias("prodEnvAssembly", ";set resourceDirectory in Compile := baseDirectory.value / \"src\" / \"main\" / \"resources\" / \"production\"; assembly")
addCommandAlias("stgEnvAssembly", ";set resourceDirectory in Compile := baseDirectory.value / \"src\" / \"main\" / \"resources\" / \"staging\"; assembly")