如何将环境变量传递给ClojureScript应用程序?

3
我有一个从Leiningen启动的ClojureScript应用程序。当它启动(或者可能是构建时),我该如何向该应用程序传递环境变量?

你能描述一下这个使用案例吗?由于ClojureScript在浏览器中运行,它与可能想要访问环境变量的服务器进程不同。 - Alan Thompson
我需要将当前的 git 分支配置传递给前端。 - user12821462
2个回答

7

有两种构建时间选项:

使用宏

CLJS宏是Clojure代码,只不过在编译时运行。因此,您可以使用常规的Clojure代码来读取环境变量,然后包含它们或执行其他宏操作。

使用goog.define

CLJS与Google Closure编译器的这个功能集成,以便传递构建时间配置

同时使用示例

相对最小的project.clj,从env-var E1设置一个goog.define

; project.clj
(defproject envvars "0.1.0-SNAPSHOT"
  :min-lein-version "2.9.1"
  :dependencies [[org.clojure/clojure "1.10.1"]
                 [org.clojure/clojurescript "1.10.597"]]
  :plugins [[lein-cljsbuild "1.1.7" :exclusions [[org.clojure/clojure]]]]
  :source-paths ["src"]
  :cljsbuild {:builds
              [{:id "dev"
                :source-paths ["src"]
                :compiler {:closure-defines {envvars.core.e1 ~(System/getenv "E1")} ; XXX
                           :main envvars.core
                           :asset-path "js/compiled/out"
                           :output-to "resources/public/js/compiled/envvars.js"
                           :output-dir "resources/public/js/compiled/out"
                           :source-map-timestamp true}}]})

宏,读取环境变量 E2

; src/envvars/coremacros.clj 
(ns envvars.coremacros)

(defmacro load-via-macro []
  (System/getenv "E2")) ; XXX

示例 "main",用于打印内容:

; src/envvars/core.cljs 
(ns envvars.core
    (:require-macros [envvars.coremacros]))

(enable-console-print!)

(goog-define e1 "undefined") ; XXX

(def e2 (envvars.coremacros/load-via-macro)) ; XXX

(println e1 e2) ; XXX

使用以下技术构建:

E1=E1 E2=E2 lein cljsbuild once

请注意在控制台中打印的E1 E2


你好,有没有办法在运行时传递配置呢?例如传递公司名称。应用程序会在 :H1 中显示公司名称。我可以使用相同的编译代码为不同的公司服务。 - Pasduti

1
我们还可以使用环境处理库,比如env
步骤:
  • 通过包含依赖项来实现:
(ns foo
  (:require-macros [adzerk.env :as env]))
  • 定义变量(如果是必填项,则添加:required
(env/def ENV_VAR :required)

假设您正在运行一个 shadow-cljs 应用程序:
export ENV_VAR=<value> && npm install && npx shadow-cljs watch app

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接