Cory Schmittさんの2015年7月31日のブログ記事Taking Advantage of Mix Configの翻訳です。
mixは言わずと知れたElixirのプロジェクト管理・依存性解決・ビルド…ツールです。最初にいじったときに「なんだかClojureのLeiningenに似ているなあ」と思ったんですが、その通りLeiningenを参考にして作られたツールで、Leiningenの設定ファイルproject.cljがClojureで書かれていると同じく設定ファイル(mix.exs)自体がElixirで書かれています。
これはmixを使うとこういうこともできるからYAMLは使わないでねという話です。
私はPaypal APIで何か購入できるElixirのライブラリを書いて実験してきました。ソースはここです。このライブラリで作業しているときに異なる環境(test, dev, production)に向けて設定するやり方が必要になりました。私はRubyから来た人なので、ついYAMLに手を出していつもの通りにやろうとしかけました。
その頃、ジェダイ・マスター、ジョゼはフォースの乱れを感じ、私が落ちようとしていた暗黒面への道についてツイートしたのです。
https://twitter.com/josevalim/status/626131275150065665 1
(訳:ElixirのプロジェクトでYAMLを使うのは止めてください。導入も使い方も不必要に複雑です。Elixirは既にconfigファイルを提供しています。)
よし、Elixirのconfigの中身がどうなってるか見てやろうじゃないの!
mixで新規にプロジェクトを作成すると、直下にconfig
というフォルダとconfig.exs
が作られます。このファイル自身よくできたドキュメントになっておりさらに詳しくはMix.Configを見れば調べられます!
コメント2をひと通り読んで各環境ごとに個別のconfigを設定できるように設定することを決めました。私は即座にimport_config "#{Mix.env}.exs"
のコメントアウトを解除して、config/test.exs
config/dev.exs
config/prod.exs
を作成しました3。
Paypai APIを使いはじめるためにいくつか設定が必要でした。
# config/dev.exs
config :ppt, #(訳註: configの後にはアプリ名を表すアトムが来ます)
user: "AeosmXJ1nZWwJgErHHhzxpOS0fH7Ki6qu4LVEotJA3al_bsZcnnYsvc1dDAi_71JYIdwkxeFHDu4sdEy"
secret: "EDL8FGl7O6Xy-oIjdvcl4TRrx9EqKEkU_vKTi2qV3S95vfh1RB9gqiBJ6Uys-NuhSWCOn3FO84JFdpXy",
currency: "USD"
これらのキーはサンドボックスAPIにしかアクセスできませんのでごあんしんください。
さたいくつかの設定値をconfigの中の取り込めました。ではどうやってこれにアクセスすればいいのでしょうか。次のようにとても簡単にできます:Application.get_env(:ppt, :user)
。このやり方でどtest、dev、prodその他どんな環境でプログラムが走っていても正しいキーを得られます。
ではこのconfigはこのライブラリが独自の環境のconfigを持つ他のmixアプリケーションにインポートされた時にはどう働くのでしょうか。
私はこのpaypalライブラリを他の練習課題プロジェクトであるphoenixフレームワークで動作するショッピングカートでインポートしました。
ショッピングカート環境のconfigファイルを使うとpaypalライブラリからインポートされたどのキーも上書きできました!すごくイケてるしすごく簡単!私の理解ではこれは以下のように動作したからだと思います。
プロジェクトの config.exs -> アプリのEnv.exs
もしこれらのファイル内でキーがセットされなければリスト上の次のものに移動するのです。私のケースではApplication.get_env
が次のように返されたのでしょう。
- ショッピングカート環境のconfigファイル
- pptのconfigファイル
Elixirに組み込まれた設定の取り扱い方法はよく考えられており、あなたがElixirのライブラリやアプリケーションを作成するときの慣習になると思います!