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

Clojure 在project.clj中指定不同的数据库地址,clojure,leiningen,Clojure,Leiningen,我有一个Leiningen Clojure项目,它在project.clj中指定了一个Postgres数据库,如下所示: :profiles {:test {:env {:db-address "//non-standard/location" ...} ...} ...} 现在我试图在数据库位于标准位置的机器上运行测试,但我不知道如何以尊重此位置的方式运行测试 我添加了一个附加的配置文件条目: :other {:env {:db-address "//standard/location"}}

我有一个Leiningen Clojure项目,它在
project.clj
中指定了一个Postgres数据库,如下所示:

:profiles {:test {:env {:db-address "//non-standard/location" ...} ...} ...}
现在我试图在数据库位于标准位置的机器上运行测试,但我不知道如何以尊重此位置的方式运行测试

我添加了一个附加的配置文件条目:

:other {:env {:db-address "//standard/location"}}}
…然后用profile other test运行
lein,认为只有
:db address
条目会覆盖
:test
中的条目,但我仍然得到
连接被拒绝的消息

我在
:other
中完全复制了
:test
条目,只是我只更改了
:db address
条目,但这没有任何效果,无论我是运行
lein with profile other test
还是
lein with profile+other test

如果我随后完全删除
:test
配置文件,leiningen将完全失败,即使文档说
lein with profile other test
应该忽略其他配置文件

我几乎被难住了。如果在运行
lein
之前在
project.clj
中用标准位置替换非标准位置,我可以运行我的测试,但我希望有一些更正式、更少黑客的东西。任何帮助都将不胜感激

编辑以添加:

我尝试用两种方法使用
^:replace
标记

:other {:env {:db-address ^:replace "//standard/location" } }
这会导致错误
元数据只能应用于IMetas

:other {:env ^:replace { ... map copied from :test profile ... } }
这会导致错误
java.io.FileNotFoundException:无法在类路径:,编译[…]上找到ring/mock/request\uu init.class或ring/mock/request.clj。显然我的类路径在这种情况下被破坏了?莫名其妙

进一步编辑以添加:


上面的“空类路径”错误显然是由于
:test
配置文件中的
:dependencies
参数导致的,我没有将该参数带入
:other
配置文件。

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


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

这应该可以工作。我能想出一些原因,但事实并非如此。您是否尝试过在您的
:other
配置文件中使用
^replace
:db address^:replace”//some location“
,或者更好地使用
:env
键。启动时是否打印并调试了
:db address
的值?您是否有一个可以覆盖project.clj中的环境变量DB_ADDRESS?应该可以。我能想到的唯一一件事是,两个概要文件都被加载,
test
覆盖了
other
。试试Kungi的建议,或者说:
lein with profile-test,+other test
啊,是的,我试过使用
:^replace
标签,只是忘了提到它。昆吉:你的评论基本上让我解决了这个问题。如果您将其作为正式答案发布,我将接受。我将为标准位置创建一个附加配置文件,并对标准db位置的测试运行
lein with profile+标准测试测试
,对另一个测试运行
lein with profile+其他测试测试。此外,您可以为这两种情况创建别名,如
{:别名{“test”[“with profile”“+standard test”“test”]“test other”[“with profile”“+other test”“test”]}