IntellijでScalaビルド時にユーザ定義環境変数を定義するための手段について幾つか試してみた

IntelliJ上でsbt shellからScalaをビルドする際に、環境変数をScalaコード経由でbuild.sbt内変数に定義しようとして躓いていました。結果としてビルド構成を作ることで対応できました。その際にどうやれば出来るかと試してみた内容について、それぞれ書いてみました。
2020.12.02

はじめに

IntelliJ上でsbt shellにてビルド実行時、build.sbtを読み込むタイミングで環境変数が見つからず失敗するという状況に陥りました。静的ファイルから取得していたバージョン情報を環境変数経由に変更し、Scalaコード経由で参照してbuild.sbt内で定義するという仕組みでしたが上手くいかなかったようです。

.envファイルからの読み取り、VMのパラメータからsbtoptsまで確認したものの、sbt shell起動時にbuild.sbtを読み込んだタイミングでユーザ定義の環境変数は設定出来ないようで、適切なビルド構成に環境変数指定を追加することで対応しました。

今回のパラメータの受け渡しについて調べていると、色々な質疑投稿で案外特定の手段だけ提示されていることが多いことに気が付きました。手段毎に検索する手間を減らすことを兼ねて、色々な手段を一通り触ってみた結果についてまとめてみました。

検証環境について

IntelliJ上でビルド時に独自環境変数を定義する

実行設定への追加や、プラグインを用いる方法等いくつかあります。広く使われていると思われる方法について挙げていきます。

  • ScalaTestでのEnvironment Variables
  • EnvFileでの設定
  • sbtopts

ScalaTestでのEnvironment Variables

実行する方法によって環境変数を切り替えたいのであれば、この設定がおすすめです。

メニューの「RUN」から「Edit Configurations…」を選択。

「Add New Configuration」から「ScalaTest」を選択します。

「Environment Variables」に<NAME>=<KEY>と入力します。

右側から専用のダイアログを利用することも可能です。

EnvFileでの設定

外部ファイル参照となるので、管理のしやすさがポイントです。

インストール後、ScalaTestの設定に「EnvFile」が追加されます。設定方法は上記リンク先に記載されている通りです。

項目 意味
Substitute Environment Variables (${FOO} / ${BAR:-default} / $${ESCAPED}) 代替環境変数(${FOO} / ${BAR:-default} / $${ESCAPED})を有効にする
Process JetBrains path macro references ($PROJECT_DIR$) JetBrainsのパスマクロ参照($PROJEDT_DIRS$)を処理する
Ignore missing files ファイルがない場合に無視する
Enable experimental integrations (e.g. Gradle) - may break any time! Gradle等の実験的な連携を有効にする - 何時でも停止できます

利用するEnvFileの指定にて.envがファイルダイアログ上で非表示になっている場合は、Shift + Command + .(ピリオド)で表示させましょう。

値の設定はVERSION=testのようにシェルでの定義と同一です。

sbtoptsでの指定

EnvFileと異なり、追加指定はせずに使えます。プロジェクトルートに.sbtoptsファイルを追加します。書き方はVMでパラメータを追加する時と同じです。

設定方法別一覧

方法 特徴 値の設定 実際の設定
Environment Variables 環境変数として設定する
<KEY>=<VALUE>
VERSION=test
EnvFile プラグインのインストールが必要。
独自に.envファイルから読み込みを行う。
ジョブ実行直後にはまだ反映されていない。
<KEY>=<VALUE>
VERSION=test
sbtopts sbtのオプションとしてVMに渡す。
プロジェクトルートでドットファイルにて管理。
追加設定は不要。
-D<KEY>=<VALUE>
-DVERSION=test

これらを全て導入しても、いずれも機能します。が、キーが同じで値が異なる場合、想定外な挙動になる可能性があります。

あとがき

静的ファイルからの読み込みで賄えてしまっていたためにビルド構成に手をつけていなかったのが原因でしたが、パラメータを渡す方法について実際に動作を見ながら確認するいい機会になりました。

ユースケースに応じての参考になれば幸いです。

参考リンク