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

3 clojurescript

我有一个从 Leiningen 启动的 ClojureScript 应用程序。我如何在应用程序启动时将 env 变量传递给它(可能是在它建立时)

cfr*_*ick 7

有两个构建时间选项:

使用宏

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

使用 goog.define

CLJS 与 Google Closure 编译器的此功能集成以传递构建时 配置

使用两者的示例

相对最小project.cljgoog.define从 env-var设置 a 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}}]})
Run Code Online (Sandbox Code Playgroud)

读取 env-var 的宏E2

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

(defmacro load-via-macro []
  (System/getenv "E2")) ; XXX
Run Code Online (Sandbox Code Playgroud)

示例“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
Run Code Online (Sandbox Code Playgroud)

构建:

E1=E1 E2=E2 lein cljsbuild once
Run Code Online (Sandbox Code Playgroud)

E1 E2,控制台中正在打印