Переменные окружения Figwheel - PullRequest
0 голосов
/ 27 апреля 2018

Я понимаю, что 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 ]

0 голосов
/ 27 апреля 2018

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

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

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

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

0 голосов
/ 27 апреля 2018

Один из способов сделать это - 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.

...