Я бы сказал, что самым чистым решением было бы использование библиотеки environment вместе с плагином lein-environ
.
С ними вы храните версию API-ключей для разработки в env-переменных в Leiningen Dev Profile и на производстве передать их в качестве фактических переменных среды. Например, в вашем project.clj
может быть следующее:
(defproject ...
...
:profiles {:dev {:env {:my-api-key "whatever-dev" } } }
...)
В производственной среде вы можете просто установить переменную среды MY_API_KEY в значение «what-prod».
В своем коде вы получит доступ к ключу следующим образом:
(require '[environ.core :refer [env]])
(env :my-api-key) ;; would yield "whatever-dev" on dev and "whatever-prod" on prod environment
В частности, это позволяет вам не хранить производственные ключи под контролем источника.
environ
предоставляет еще пару опций - в частности, с файлы env, которые также могут соответствовать вашим потребностям. Проверьте его возможности.
Если вам также необходим доступ к переменным окружения в вашем CL JS (во внешнем интерфейсе), вы не сможете просто получить доступ к переменным окружения там (потому что больше нет такого понятия, как окружение - код работает на клиенте).
Тем не менее, если вы просто наберите sh, чтобы сбросить значения в результирующее js во время компиляции, вы можете использовать для этого Environment + и макрос. Вы напишите макрос в файле clj, который просто возвращает env var, а затем ссылается на него в файле cl js. Во время компиляции будет введено соответствующее значение.
В файле clj:
(ns yourns.environment
(:require [environ.core :refer [env]]))
(defmacro my-api-key []
(env :my-api-key))
В cl js:
(ns yourns.core
(:require-macros [yourns.environment :refer [my-api-key]))
(my-api-key) ;; will return the appropriate value
Однако, опять же, обратите внимание, что значение переменной будет введено во время компиляции и не может быть изменено позже.
Пожалуйста, посмотрите здесь для полного примера кода.