2014-03-13 32 views
4

在我的Leiningen project.clj中,我使用environ来设置不同配置文件中的环境变量。我想用lein-ring构建一个演示uberjar,它为生产版本使用某些环境变量的不同值。不过,由于某种原因,我似乎无法捡起它们。uberjar使用lein ring构建时无法看到配置文件环境变量

我在project.clj一个demo配置文件定义是这样的:

: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 

但访问FOO或environ.core/env酒吧所产生的独立罐子回报nil内在这两种情况下。另一方面,如果我运行

lein with-profile demo ring server-headless 

我可以访问这两个值。

这是怎么发生的?这真的不是我所期望的。它看起来像uberjar一直是用制作配置文件创建的。或者是别的什么?

lein-ring页面并声明如下:

雷音环注重一些环境变量,包括: 端口 - Web服务器使用HTTP SSLPORT港 - 港 Web服务器使用for HTTPS

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

目前尚不清楚的是,这意味着,在project.clj指定的任何其他环境变量将是忽略,但是。

在Windows上运行leiningen 2.3.4。

回答

3

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

相反,lein-environ和附带的environ.core/env函数为您提供了一种为测试和开发目的伪造环境变量的方法,无需在启动Leiningen之前手动设置环境变量。它通过将项目图中提供的变量写入插件代码中的.lein-env文件并在从项目代码中调用env时将这些值与实际操作系统环境中的值合并来实现此目的。因此,当你去运行uberjar时,你实际上需要在你的Windows环境中(或者在当前目录中的.lein-env文件中,我不会推荐这些变量)存在这些变量。如果您的目标是使用预设的环境变量来提供独立的演示来控制某些应用程序的行为,那么我会创建一个.cmd脚本与您的应用程序一起分发,该应用程序将设置适当的环境变量,然后启动uberjar。

+0

谢谢。的确,我知道Environ是如何工作的,但我并没有真正感受到它只是用于测试。我知道它在网站上说,对于生产你可以在操作系统环境变量中替代,但我认为Environ是我想在生产中使用的东西,作为配置不同版本的一种很好的方式。我想通过脚本来设置这些演示变量的想法是可以接受的。我也可以通过Java系统属性来设置它们。 – ChrisM

+1

您当然可以采用类似的方法,将属性写入您在uberjar而不是文件系统中捆绑的资源文件,但这需要一些自定义代码。但是,任何直接使用'System/getenv'检查环境变量的代码都不会受到'lein-environ'中设置的属性的影响。 – Alex

+1

此外,'environ.core'完全适合生产使用。除非在执行Leiningen任务时,您不应期望通过'lein-environ'设置的属性对您的项目代码可见。 – Alex

相关问题