Figwheel环境变量

时间:2018-04-27 05:09:02

标签: clojure clojurescript reagent 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 个答案:

答案 0 :(得分:2)

一种方法是通过closure-defines

E.g。在project.clj中:

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

version是我项目中的def。所以你可以调整它来读取env-var等。

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

然后在你的example.core ns中:

(goog-define version "dev")

然后像常规的def一样使用它。

答案 1 :(得分:0)

我假设你已经阅读了所有关于lein profiles的内容。如果您还没有看到它,请务必查看lein中的Dynamic Eval

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

然后,您可以使用动态读取的信息来设置不同的:main或不同的:source-paths来提取具有不同常量的代码。

当然,不要忘记审核所有the compiler options