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