如何访问leiningen配置文件的值?

zca*_*ate 14 clojure leiningen

我在project.clj中定义了两个配置文件,一个在本地,一个用于在travis上测试:

:profiles {:dev {:dependencies [[midje "1.6.0"]
                                [mysql/mysql-connector-java "5.1.25"]]
                 :plugins [[lein-midje "3.1.3"]]
                 :user "root" :pass "root"}
           :travis {:user "travis" :pass ""}}
Run Code Online (Sandbox Code Playgroud)

我希望能够访问:user和:传递我的项目中的值.如何才能做到这一点?

更新:

我也希望能够使用lein with-profile命令......所以我的测试会有:

lein with-profile dev test
Run Code Online (Sandbox Code Playgroud)

- >会使用"root","root"凭据

lein with-profile dev,travis test
Run Code Online (Sandbox Code Playgroud)

- >会使用"travis",""凭据

And*_*rew 15

如果您不需要project.clj为其他任何内容定义的值(IE,您可以自由选择表示),请考虑Environ.

然后,您可以在project.clj中定义以下内容

:profiles {:dev {:env {:user "root" :pass "root"}}}
Run Code Online (Sandbox Code Playgroud)

并阅读值:

(use 'environ.core)

(def creds
  {:user (env :user)
   :pass (env :pass)})
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,您还可以使用环境变量和系统属性指定值.


pon*_*zao 7

Leiningen的构建文件是Clojure代码,因此您只需阅读:

(->> "project.clj" slurp read-string (drop 3) (partition 2) (map vec) (into {})
     :profiles :dev)
; => {:dependencies [[midje "1.5.1"] [ring-server "0.2.8"]], :plugins [[lein-midje "3.1.0"]]}
Run Code Online (Sandbox Code Playgroud)

如果您需要更重的功能(例如访问最终的项目图),那么像configleaf这样的东西可能更适合.

管理它的另一种方法(我经常使用)是为配置文件特定数据提供单独的配置文件:

example/profiles/travis/example/config.clj:

(ns example.config)

(def user "travis")
(def pass "")
Run Code Online (Sandbox Code Playgroud)

example/dev-resources/example/config.clj:

(ns example.config)

(def user "root")
(def pass "root")
Run Code Online (Sandbox Code Playgroud)

example/src/example/core.clj:

(ns example.core
  (:require [example.config :as config]))

(println config/user)
Run Code Online (Sandbox Code Playgroud)

您需要将配置文件特定的资源路径添加到您的project.clj:

:profiles {:travis {:resource-paths ["profiles/travis/"]}}
Run Code Online (Sandbox Code Playgroud)