我有一个Leiningen Clojure项目,它在project.clj
中指定了一个Postgres数据库:
:profiles {:test {:env {:db-address "//non-standard/location" ...} ...} ...}
现在我尝试在数据库处于标准位置的计算机上运行测试,而我无法弄清楚如何以尊重此位置的方式运行测试。
我已添加了其他个人资料条目:
:other {:env {:db-address "//standard/location"}}}
...然后运行lein with-profile other test
,认为只有:db-address
条目会覆盖:test
中的条目,但我仍然会Connection refused
。
我完全在:test
中复制了:other
条目,只是我更改了:db-address
条目,但这不会产生任何影响,无论我是否运行lein with-profile other test
或lein with-profile +other test
。
如果我然后完全删除了:test
个人资料,leiningen就会完全失败,即使文档说lein with-profile other test
应该忽略其他个人资料。
我非常难过。如果我在运行project.clj
之前用lein
中的标准位置替换非标准位置,我可以运行我的测试,但我希望有更正式和更少hacky的东西。任何帮助将不胜感激。
编辑添加:
我尝试过以两种方式使用^:replace
标记。
:other {:env {:db-address ^:replace "//standard/location" } }
这会导致错误Metadata can only be applied to IMetas
。
:other {:env ^:replace { ... map copied from :test profile ... } }
这会导致错误java.io.FileNotFoundException: Could not locate ring/mock/request__init.class or ring/mock/request.clj on classpath: , compiling [...]
。显然我的CLASSPATH在这种情况下得到了解决?莫名其妙。
进一步编辑:
"空类路径"上面的错误显然是由:dependencies
个人资料中的:test
参数引起的,我并未将其移至:other
个人资料。
答案 0 :(得分:0)
我发现最好不要将此信息直接保存在我的project.clj文件中。相反,我使用environ,它允许您使用shell环境变量或环境配置文件 - 您可以为每个环境使用不同的文件。
这样做的好处是,您不必担心可能会将敏感数据库详细信息推送到版本控制中,并且您可以获得更简单的project.clj(IMO)设置。我没有将我的环境配置文件放入版本控制中,我发现使用环境配置文件和普通shell环境(可能不熟悉clojure的系统管理员非常熟悉)的组合来管理部署很容易。 / p>