如何将环境变量传递给 ClojureScript 应用程序?
How to pass env variables to ClojureScript app?
我有一个从 Leiningen 启动的 ClojureScript 应用程序。如何在应用程序启动时将环境变量传递给应用程序(可能是在构建时)
有两个构建时间选项:
使用宏
CLJS 宏是 Clojure 代码,在编译时运行。所以你可以使用
用于读取环境变量的常规 Clojure 代码,或者
包括它们或做其他宏观的事情。
使用goog.define
CLJS 与 Google 闭包编译器的这个功能集成到
传递构建时间
configurations.
使用两者的示例
相对最小 project.clj
,设置 goog.define
来自
环境变量 E1
:
; 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
正在控制台中打印
我们还可以使用环境处理库,例如 env
步骤:
- 因此包括依赖项:
(ns foo
(:require-macros [adzerk.env :as env]))
- 定义 var(如果必须,请添加
:required
)
(env/def ENV_VAR :required)
- 假设您是 运行 shadow-cljs 应用程序:
export ENV_VAR=<value> && npm install && npx shadow-cljs watch app
我有一个从 Leiningen 启动的 ClojureScript 应用程序。如何在应用程序启动时将环境变量传递给应用程序(可能是在构建时)
有两个构建时间选项:
使用宏
CLJS 宏是 Clojure 代码,在编译时运行。所以你可以使用 用于读取环境变量的常规 Clojure 代码,或者 包括它们或做其他宏观的事情。
使用goog.define
CLJS 与 Google 闭包编译器的这个功能集成到 传递构建时间 configurations.
使用两者的示例
相对最小 project.clj
,设置 goog.define
来自
环境变量 E1
:
; 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
正在控制台中打印
我们还可以使用环境处理库,例如 env
步骤:
- 因此包括依赖项:
(ns foo
(:require-macros [adzerk.env :as env]))
- 定义 var(如果必须,请添加
:required
)
(env/def ENV_VAR :required)
- 假设您是 运行 shadow-cljs 应用程序:
export ENV_VAR=<value> && npm install && npx shadow-cljs watch app