4

在我的 Leiningen project.clj 中,我使用environ在不同的配置文件中设置环境变量。我想用 lein-ring 构建一个演示 uberjar,它对某些环境变量使用与生产版本不同的值。但是,出于某种原因,我似乎无法接听它们。

demo在我的 project.clj 中有一个类似这样的配置文件:

:demo {:dependencies [[javax.servlet/servlet-api "2.5"]]
       :plugins [[lein-environ "0.4.0"]]
       :env {:foo "FOO" :bar "BAR"}}

然后我执行

lein with-profile demo ring uberjar

environ.core/env但是在这两种情况下,在生成的独立 jar中访问 foo 或 bar都会返回nil。另一方面,如果我跑

lein with-profile demo ring server-headless

我可以访问两者的值。

为什么会这样?这真的不是我所期望的。看起来 uberjar 总是使用生产配置文件创建的。还是有别的事情发生?

lein -ring页面确实说明了以下内容:

Lein-Ring 关注几个环境变量,包括: PORT - 网络服务器用于 HTTP 的端口 SSLPORT - 网络服务器用于 HTTPS 的端口

这些将覆盖 project.clj 文件中指定的任何选项,但不会覆盖命令行中指定的任何选项。

但是,不清楚这是否意味着 project.clj 中指定的任何其他环境变量都将被忽略

在 Windows 上运行 leiningen 2.3.4。

4

1 回答 1

3

看起来该lein-environ插件实际上并没有在物理上设置环境变量(实际上,您不能在 Java 中在当前进程上设置环境变量 - 有关详细信息,请参见此处)。即使假设它可以,问问自己 - 你将如何确保在构建 uberjar 时存在的环境变量在运行时存在?

相当,lein-environ附带的environ.core/env功能为您提供了一种为测试和开发目的伪造环境变量的方法,而无需在启动 Leiningen 之前手动设置环境变量。它通过将项目映射中提供的变量写入插件代码中的文件,并在从项目代码.lein-env调用时将这些值与实际操作系统环境中的值合并来实现这一点。env

因此,当您运行 uberjar 时,您实际上需要将这些变量存在于您的 Windows 环境中(或者存在于.lein-env当前目录中的文件中,我不建议这样做)。如果您的目标是提供一个使用预设环境变量来控制某些应用程序行为的独立演示,我将创建一个.cmd脚本与您的应用程序一起分发,该脚本将设置适当的环境变量,然后启动 uberjar。

于 2014-03-13T18:02:58.777 回答