Как передать переменные env в приложение ClojureScript? - PullRequest
2 голосов
/ 26 февраля 2020

У меня есть приложение ClojureScript, которое запускается из Лейнингена. Как передать переменные env в приложение, когда оно запускается (может быть, когда оно работает)

1 Ответ

3 голосов
/ 26 февраля 2020

Существует две опции время сборки :

Использование макросов

CL JS макросы - это код Clojure, который выполняется во время компиляции. Таким образом, вы можете использовать обычный код Clojure, чтобы читать переменные среды и включать их или делать другие макроэкономические операции.

Использование goog.define

CL JS интегрируется с этим средством Компилятор Google Closure передает время сборки конфигурации .

Пример использования обоих

Относительно минимальный project.clj, который устанавливает goog.define из env-var 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}}]})

Макрос, который читает env-var 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

Build с:

E1=E1 E2=E2 lein cljsbuild once

Вот E1 E2, печатаемый в консоли

...