我想说最干净的解决方案是将environ 库与lein-environ 插件一起使用。
通过这些,您可以将 API 密钥的开发版本存储在 leiningen 开发配置文件中的 env var 中,并在生产环境中将它们作为实际环境变量传递。例如。您可以在project.clj 中包含以下内容:
(defproject ...
...
:profiles {:dev {:env {:my-api-key "whatever-dev" } } }
...)
在生产环境中,您可以简单地将环境变量 MY_API_KEY 设置为“whatever-prod”。
在您的代码中,您将像这样访问密钥:
(require '[environ.core :refer [env]])
(env :my-api-key) ;; would yield "whatever-dev" on dev and "whatever-prod" on prod environment
特别是,这允许您不将生产密钥存储在源代码控制之下。
environ 提供了更多选项 - 特别是 env 文件,它也可能满足您的需求。请检查它的功能。
如果您还需要访问 CLJS 中的环境变量(在前端),您确实不能简单地访问那里的环境变量(因为不再有环境之类的东西 - 代码在客户端上运行)。
不过,如果您只想在编译期间将值放入生成的 js 中,您可以使用 environ + 宏。您将在 clj 文件中编写一个仅返回 env var 的宏,然后在您的 cljs 文件中引用它。在编译期间,将注入适当的值。
在 clj 文件中:
(ns yourns.environment
(:require [environ.core :refer [env]]))
(defmacro my-api-key []
(env :my-api-key))
在 cljs 中:
(ns yourns.core
(:require-macros [yourns.environment :refer [my-api-key]))
(my-api-key) ;; will return the appropriate value
但请注意,变量值将在编译时注入,以后无法更改。
完整的代码示例请参见here。