Как получить доступ к значениям профилей 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 ""}}

Я надеюсь получить доступ к значениям пользователя и: pass в моих проектах. Как это можно сделать?

Update:

Я также хочу иметь возможность использовать команду lein with-profile... поэтому мои тесты будут иметь:

lein with-profile dev test

- > будет использовать "root", "root" учетные данные

lein with-profile dev,travis test

- > будет использовать "travis", "" credentials

Ответ 1

Если вам не нужны значения, определенные в project.clj для чего-либо еще (IE, вы можете выбрать представление), рассмотрите Environ.

Затем вы можете определить следующее в своем проекте .clj

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

и прочитайте значения:

(use 'environ.core)

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

Это имеет то преимущество, что вы также можете указать значения, используя переменные среды и свойства системы.

Ответ 2

Файл сборки 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/"]}}