在我的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。
谢谢。的确,我知道Environ是如何工作的,但我并没有真正感受到它只是用于测试。我知道它在网站上说,对于生产你可以在操作系统环境变量中替代,但我认为Environ是我想在生产中使用的东西,作为配置不同版本的一种很好的方式。我想通过脚本来设置这些演示变量的想法是可以接受的。我也可以通过Java系统属性来设置它们。 – ChrisM
您当然可以采用类似的方法,将属性写入您在uberjar而不是文件系统中捆绑的资源文件,但这需要一些自定义代码。但是,任何直接使用'System/getenv'检查环境变量的代码都不会受到'lein-environ'中设置的属性的影响。 – Alex
此外,'environ.core'完全适合生产使用。除非在执行Leiningen任务时,您不应期望通过'lein-environ'设置的属性对您的项目代码可见。 – Alex