1

我了解 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 代码中,我想以某种方式访问​​它们。如果重要的话,我正在运行一个试剂项目。

4

2 回答 2

3

一种方法是通过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.corens 中:

(goog-define version "dev")

然后像普通的一样使用它def

于 2018-04-27T05:38:02.073 回答
0

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

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

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

当然,不要忘记查看所有编译器选项

于 2018-04-27T15:34:05.973 回答