在project.clj中指定不同的数据库地址

时间:2015-01-09 21:09:16

标签: clojure leiningen

我有一个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 testlein 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个人资料。

1 个答案:

答案 0 :(得分:0)

我发现最好不要将此信息直接保存在我的project.clj文件中。相反,我使用environ,它允许您使用shell环境变量或环境配置文件 - 您可以为每个环境使用不同的文件。

这样做的好处是,您不必担心可能会将敏感数据库详细信息推送到版本控制中,并且您可以获得更简单的project.clj(IMO)设置。我没有将我的环境配置文件放入版本控制中,我发现使用环境配置文件和普通shell环境(可能不熟悉clojure的系统管理员非常熟悉)的组合来管理部署很容易。 / p>