在 nrepl 启动时临时加载环境变量

问题描述 投票:0回答:1

我有一个使用 leiningen 的 clojure 项目。我想从 nrepl start 上的文件加载环境变量。我只希望它在 repl start 上运行,因为这些环境变量是为本地开发配置的。

我不想在 edn 配置中使用默认参数的原因是环境变量可能包含一些敏感信息(即使对于本地开发),例如 API 令牌,这对于每个开发人员来说都是不同的。我不想这样做。将有一个文件“repl_env”,其中包含所有开发 evn 变量。该文件将被添加到 .gitignore 中,从而确保这些文件永远不会被提交。

我看到

:init
下面有
:repl-options
,但我不确定如何利用它来加载环境变量。有什么建议吗?

clojure leiningen nrepl
1个回答
0
投票

可以使用系统属性代替环境变量吗?如果是这样,您可以按照以下方法进行操作。可以使用 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

© www.soinside.com 2019 - 2024. All rights reserved.