如何访问Leiningen配置文件中的值?

14

我在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 ""}}

我希望能够在我的项目中访问:user和:pass值。如何实现?

更新:

我还想能够使用lein with-profile命令...以便我的测试拥有:

lein with-profile dev test

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

lein with-profile dev,travis test

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


我认为这个问题在这里得到了解决:https://dev59.com/KmQo5IYBdhLWcg3wKcvH - tangrammer
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
15
如果你不需要在其他地方使用project.clj中定义的值(也就是说,你可以自由选择表示方法),那么可以考虑使用Environ

然后你可以在project.clj中定义以下内容。

:profiles {:dev {:env {:user "root" :pass "root"}}}

并读取这些值:

(use 'environ.core)

(def creds
  {:user (env :user)
   :pass (env :pass)})

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


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"]]}
如果您需要更强大的功能(例如访问最终项目映射),那么像configleaf这样的工具可能更合适。 另一种管理方法(我经常使用的)是为特定配置数据创建单独的配置文件: example/profiles/travis/example/config.clj:
(ns example.config)

(def user "travis")
(def pass "")

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

(ns example.config)

(def user "root")
(def pass "root")

example/src/example/core.clj:

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

(println config/user)

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

:profiles {:travis {:resource-paths ["profiles/travis/"]}}

我更新了我的问题。它取决于选择的配置文件。 - zcaudate
@zcaudate,您可以尝试使用 configleaf,它提供了访问最终项目映射的功能,其中包含所选配置文件的合并。 - ponzao
@zcaudate,我添加了另一种处理您的用例的方法,这不需要额外的依赖项。 - ponzao
1
感谢提供两种配置文件的方法。我将选择eniron答案,因为这是我用来实现travis ci的方法-https://github.com/zcaudate/manas,但我已经点赞并且在更大的项目中一定会使用你的方法。 - zcaudate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,