我有一个使用 leiningen 的 clojure 项目。我想从 nrepl start 上的文件加载环境变量。我只希望它在 repl start 上运行,因为这些环境变量是为本地开发配置的。
我不想在 edn 配置中使用默认参数的原因是环境变量可能包含一些敏感信息(即使对于本地开发),例如 API 令牌,这对于每个开发人员来说都是不同的。我不想这样做。将有一个文件“repl_env”,其中包含所有开发 evn 变量。该文件将被添加到 .gitignore 中,从而确保这些文件永远不会被提交。
我看到
:init
下面有 :repl-options
,但我不确定如何利用它来加载环境变量。有什么建议吗?
可以使用系统属性代替环境变量吗?如果是这样,您可以按照以下方法进行操作。可以使用 JVM 的命令行参数设置系统属性,因此可以使用 Leiningen 来完成此操作。
我是这样做的。我创建了一个新项目
lein new syspropdemo
并编辑了以下文件:
将行
:profiles {:repl {:jvm-opts ["@sysprops.txt"]}}
添加到 project.clj
并设置主命名空间。字符串 @sysprops.txt
表示我想从文件中读取其他命令行参数 sysprops.txt
:
(defproject syspropdemo "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
:url "https://www.eclipse.org/legal/epl-2.0/"}
:profiles {:repl {:jvm-opts ["@sysprops.txt"]}}
:main syspropdemo.core
:dependencies [[org.clojure/clojure "1.11.1"]]
:repl-options {:init-ns syspropdemo.core})
在
-main
中创建了一个基本的 src/syspropdemo/core.clj
函数:
(ns syspropdemo.core)
(defn -main [& _args]
(println "The api key is" (System/getProperty "api_key")))
并且还在项目根目录中添加了一个文件
sysprops.txt
,其中列出了 JVM 使用的选项:
-Dapi_key=xyz
我使用
-D
选项通过键 api_key
设置系统属性以获取值 xyz
。
$ lein run
The api key is nil
$ lein repl
nREPL server started on port 38171 on host 127.0.0.1
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1, *2, *3, an exception in *e
syspropdemo.core=> (-main)
The api key is xyz
nil
除了
:repl
型材外,还有其他型材,例如:dev
、:test
、:production
、:uberjar
。