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

4

我有一个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条目并将:db-address条目更改为:other,但无论我是运行lein with-profile other test还是lein with-profile +other test都没有任何效果。

如果我完全删除:test档案,则leiningen会完全失败,尽管文档说lein with-profile other test应该忽略其他档案。

我几乎被卡住了。如果在运行lein之前在project.clj中以文本方式替换非标准位置为标准位置,我可以运行测试,但我希望有一些更官方和不那么hacky的方法。任何帮助将不胜感激。

编辑添加:

我尝试使用^:replace标签的两种方式。

:other {:env {:db-address ^:replace "//standard/location" } }

这会导致一个错误:Metadata 只能应用于 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被清空了?令人困惑。

进一步编辑添加:

刚才出现的“空类路径”错误显然是由于我没有将:test配置文件中的:dependencies参数带到:other配置文件中。


1
这个应该有效。我能想到一些原因它不能工作。你尝试过在 :other 配置文件中使用 ^replace 像这样 :db-address ^:replace "//some-location"或者在整个 :env 键上更好。您在启动时打印调试 :db-address 的值了吗?您有一个名为 DB_ADDRESS 的环境变量,是否可以覆盖项目.clj中的变量? - Kungi
应该可以工作。我能想到的唯一一件事是两个配置文件都被加载了,而 test 覆盖了 other。尝试 Kungi 的建议或者尝试这个:lein with-profile -test,+other test - user21037
啊,是的,我尝试使用了“:^replace”标签,只是忘记提到了。详细信息请参见上方添加的内容。 - Sean
1
Kungi:你的评论基本上帮我解决了这个问题。如果你把它发布为正式答案,我会接受它。 - Sean
我会为标准位置创建一个额外的配置文件,然后只需运行 lein with-profile +standard-test test 进行标准数据库位置的测试,而对于另一个位置则运行 lein with-profile +other-test test。此外,您可以为这两种情况创建别名,例如 {:aliases {"test" ["with-profile" "+standard-test" "test"] "test-other" ["with-profile" "+other-test" "test"] } } - user771505
1个回答

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接