用shadow-cljs编译代码时使用环境变量实现多编译环境
原方案
前端有个config.cljs文件,定义了一个domain的函数,指定api接口的base-url,本地开发、测试、生产分别修改成不同地址。类似这样吧:
(ns <>.config)
;; 测试环境
#_(def domain "https://test.url.com")
;; 生产环境
#_(def domain "https://prod.url.com")
;;开发环境
(def domain "http://localhost:3000")
很显然,这个不是长久之计,又不智能,部署时还要修改地址,容易忘记,并且还有时会把修改提交上去。尤其是没有持续集成工具帮助做部署工作的时候。~
当前方案
shadow-cljs用户指南我没有通读,但是从目录看也有环境变量章节看,也有方案。
采用closure-defines的方案,指定多个build id,在不同的build中传入环境变量。
(ns <>.config)
;;此处的变量需要修改的请在项目跟目录的shadow-cljs.edn中修改
(goog-define domain "http://localhost:3000")
shadow-cljs.edn
配置大概这样
:builds
{:app
{:target :browser
:output-dir "target/cljsbuild/public/dev/js"
:asset-path "/js"
:modules {:app {:entries [YOUR-APP.app]}}
:devtools
{:watch-dir "resources/public"
:ignore-warnings true
:preloads [re-frisk.preload]}
:closure-defines {"re_frame.trace.trace_enabled_QMARK_" true}
:dev {:closure-defines {<>.config/domain "http://localhost:3000"}}}
:test-app
{:target :browser
:output-dir "target/cljsbuild/public/test/js"
:asset-path "/js"
:modules {:app {:entries [YOUR-APP.app]}}
:release {:closure-defines {<>.config/domain "https://test.url.com"}}}
:prod-app
{:target :browser
:output-dir "target/cljsbuild/public/prod/js"
:asset-path "/js"
:modules {:app {:entries [YOUR-APP.app]}}
:release {:closure-defines {<>.config/domain "https://prod.url.com"}}}}
好处
- 可以定义多个变量,比如从多个api地址
- 可以配置无限多个
不好处
- 如果有新增地址,需要修改多个builds的配置
- 地址明文可见,想做部署层的保密的话,不可以。
其他方案
还是在这篇文章里,后面提到了别的方案。当前来说上面的不利之处还不是个问题,用到时再调整其他方案。