Переменные окружения Figwheel

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

Исходя из сборки / среды, мне может потребоваться другое поведение в моем коде. Например, когда в dev я подключаюсь к определенной конечной точке API, а в prod это другая конечная точка. В идеале я хотел бы каким-то образом (предположительно, это относится к project.clj) указать переменные, специфичные для среды, и затем получить к ним доступ в моем коде cljs.

Есть ли механизм для этого?

Я представляю что-то вроде этого:

:cljsbuild {
    :builds [{:id "dev"
              :source-paths ["src"]
              :figwheel true
              :env-variables {foo "bar"
                              bar "foo"} ; <-------
              :compiler {:main hello-seymore.core 
                         :asset-path "cljs/out"
                         :output-to  "resources/public/cljs/main.js"
                         :output-dir "resources/public/cljs/out"} 
             }
             {:id "prod"
              :env-variables {foo "different value for foo"
                              bar "different value for bar"}}] ; <-------
              ; etc
   }

И затем в моем коде cljs я хотел бы получить доступ к ним как-то. Если это имеет значение, я запускаю проект Reagent.

2 ответа

Один из способов сделать это через closure-defines,

Например в вашем project.clj:

:cljsbuild { ; ...
            :builds [{:id "min"
                      ;;; XXX: map with your values
                      :compiler {:closure-defines {"example.core.version" ~version}
                                 ; ...

version это определение в моем проекте здесь. Таким образом, вы можете настроить это для чтения env-var и т. Д.

(def version
  (->
    (clojure.java.shell/sh "git" "describe" "--always")
    :out
    clojure.string/trim))

Тогда в вашем example.core нс:

(goog-define version "dev")

А затем использовать его как обычный def вещь

Я предполагаю, что вы уже прочитали все о профилях lein. Если вы еще этого не видели, обязательно посмотрите Dynamic Eval в lein:

{:user {:compile-path  #=(eval (System/getenv "ci.compile-path" )),
        :target-path   #=(eval (System/getenv "ci.target-path"  )) }}

Затем вы можете использовать динамически читаемую информацию, чтобы установить другой :mainили другой :source-paths тянуть код с разными константами.

Конечно, не забудьте просмотреть все параметры компилятора.

Другие вопросы по тегам