Clojureで環境別設定の切り分けを行う「clojure-config」


YouSee/clojure-config – GitHub

自分でjson書いて、パースしてってやれば、簡単な物はできるので、作っても良かったのですが、だるかったので、既にライブラリがあるだろうから、探してみたところやっぱりありました。

名前がかなり分かりづらいですけど、clojure-configというライブラリです。

これは、環境識別の設定を環境変数「ENV」に設定されている環境識別子、ホスト名またはユーザ名に基づいて設定することが出来ます。

まずは、project.cljに下記を追加します。

[clojure-config "1.0.5"]

使い方はこんな感じになります。

(ns hoge.environment_test
  (:use clojure-config.core))
 
(set-properties [
  ;; ===============================
  ;; GLOBAL Settings
  ;; ===============================
  {:name "global"
   :properties {:port 8080
                :db-name "example_development"
                :db-host "localhost"}}
  ;; ===============================
  ;; DEVELOPMENT Settings
  ;; ===============================
  {:name "development" :type "user" :value "ubuntu"}
  ;; ===============================
  ;; TEST Settings
  ;; ===============================
  {:name "test" 
   :type "user" 
   :value "ubuntu"
   :properties {:db-name "example_test"}}
  ;; ===============================
  ;; PRODUCTION Settings
  ;; ===============================
  {:name "production" 
   :type "user" 
   :value "ubuntu"
   :properties {:db-name "example_production"}}
  ;; ===============================
  ;; LOCAL Settings
  ;; ===============================
  {:name "local" :type "user" :value "tatsuya" :parent "dev"}])
 
(defn -main []
  ;; プロパティの値をキーを基に取得
  (println (property :db-name))
  ;; プロパティのマップを取得
  (println (properties))

で、これを実行する場合、下記のようにENVに各環境の識別子を指定して実行します。

$ ENV=development lein run -m hoge.environment_test
$ ENV=test lein run -m hoge.environment_test
$ ENV=production lein run -m hoge.environment_test
$ ENV=local lein run -m hoge.environment_test

この、clojure-configですが、:typeに”host”または”user”を指定していますが、hostの場合は実行環境のホスト名が:valueの値と一致しないといけません。同じように:typeに”user”を指定した場合には、:valueの値が実行ユーザ名と一致しないといけません。

関連記事