コマンドラインツールを作る時、プログラムがユーザから値を受ける方法は何通りもあります。 特に代表的なのが設定ファイル・環境変数・コマンドライン引数です。 自分でプログラムを書く場合、これらの値を自分の好きな順番で扱えます。 ただ、自分の好きな順番で扱えるからこそ、何をどのような優先順位で処理すべきか迷うこともあるでしょう。 本記事では、各種値を一般的にはどのように処理していくかを調べていきます。
結論
environment variables - What order of reading configuration values? - Stack Overflow でも言及されていますが、下記の優先順位で値を設定するのがベターでしょう。
- コマンドライン引数
- コマンドライン引数で明示的に指定された設定ファイルからの値
- 環境変数
- ローカルの設定ファイル
- グローバルな設定ファイル
他のプロダクトではどうなっているか?
SpringBoot における設定の優先順位
Java のフレームワークである SpringBoot では次の順番で設定が読み込まれます。 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
- ホームディレクトリにある Devtool のグローバルな設定 (devtool が有効になっておりかつ
~/.spring-boot-devtools.properties
がある場合) - テストに記されている
[@TestPropertySource](https://docs.spring.io/spring/docs/5.1.8.RELEASE/javadoc-api/org/springframework/test/context/TestPropertySource.html)
アノテーションの値 - アプリケーションの一部をテストするため の
[@SpringBootTest](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/api/org/springframework/boot/test/context/SpringBootTest.html)
で設定されたテスト用の値 - コマンドライン引数の値
- 環境変数
SPRING_APPLICATION_JSON
の値 ServletConfig
の初期化値ServletContext
の初期化値java:comp/env
で設定された JNDI の値- Java System properties
- OS の環境変数
(11 以上は略)
AWS Coomand Line interface における設定の優先順位
AWS CLI では下記の順番で値が読み込まれます。 https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html
- If you specify an option by using one of the environment variables described in this topic, it overrides any value loaded from a profile in the configuration file.
- If you specify an option by using a parameter on the CLI command line, it overrides any value from either the corresponding environment variable or a profile in the configuration file.
つまり、
- コマンドライン引数
- 環境変数
- 設定ファイル
の順番です。