Как разделить ключи разработки и производства в приложении Leiningen на heroku? - PullRequest
0 голосов
/ 15 марта 2020

Я хочу иметь два разных набора ключей API для разработки и производства, и я хочу использовать их автоматически в зависимости от того, запущено ли приложение локально или на heroku.

Для nodejs приложений я делаю следующее:

if (process.env.NODE_ENV === 'production') {
// ./prod contains the production keys
module.exports = require('./prod');
} else {
// ./dev contains the development keys
module.exports = require('./dev');
}

Как сделать нечто подобное в приложении Clojure Leiningen? Каким будет аналог process.env.NODE_ENV и как его реализовать?

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Clojure работает на JVM, поэтому вы можете использовать java Системный класс. Предполагая, что вы установили переменную APP_ENVIRONMENT в bash.

(if (= "production"
       (or (System/getenv "APP_ENVIRONMENT")
           "development"))
  (start/production)
  (start/development))
0 голосов
/ 18 марта 2020

Я бы сказал, что самым чистым решением было бы использование библиотеки 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

Однако, опять же, обратите внимание, что значение переменной будет введено во время компиляции и не может быть изменено позже.

Пожалуйста, посмотрите здесь для полного примера кода.

...