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

时间:2020-02-26 11:39:30

标签: clojurescript

我有一个从Leiningen启动的ClojureScript应用程序。启动应用程序时如何将env变量传递给应用程序

2 个答案:

答案 0 :(得分:3)

有两个构建时间选项:

使用宏

CLJS宏是Clojure代码,在编译时运行。所以你可以使用 常规的Clojure代码读取环境变量,或者 包括它们或做其他宏观的事情。

使用goog.define

CLJS与Google Closure编译器的此功能集成在一起,可以 通过构建时间 configurations

同时使用两者的示例

相对最小值project.clj,它从 env-var goog.define

E1

宏,它读取env-var ; 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

构建方式:

; 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 正在控制台中打印

答案 1 :(得分:0)

我们还可以使用环境处理库,例如 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