如何在project.clj文件中引用环境变量或用户目录

6
有没有一种编程方式可以将我的主目录名称插入到Leiningen的project.clj文件中的文件路径中?
我在不同的机器上运行Leiningen项目,在这些机器上我有不同的主目录。该项目使用未由Maven管理的jar文件;我下载它们并将它们放在相对于我的主目录的目录中,或者将它们复制到Leiningen项目中。第二个选项可行但不理想。
使用第一个选项(将jar文件保留在其他地方)的简单方法是在我的Leiningen目录中添加指向“其他地方”目录的符号链接。这行得通,但每台机器上的链接都必须不同,因此我不能将链接文件包含在git仓库中,而我宁愿将所有内容都包含在git仓库中。
难道没有一种方法可以在project.clj文件中使用环境变量或以其他方式引用我的主目录吗?我已经查看了示例项目文件,但迄今为止还没有找到解决方案。

我以为我可以在运行时构建路径字符串——毕竟project.clj中的内容只是Clojure代码。既然将我的主目录硬编码到project.clj中没有任何问题:

  :resource-paths [/Users/myhomedir/dist/mason/jar/mason.19.jar")]

我想我可以这样做:

:resource-paths [(str (System/getenv "HOME") "/dist/mason/jar/mason.19.jar")]

然而,Leiningen一点也不喜欢这个:
java.lang.IllegalArgumentException: No implementation of method: :as-file of protocol: #'clojure.java.io/Coercions found for class: clojure.lang.PersistentList

[...]替换为(vector ...)会产生相同的错误,但末尾会出现'clojure.lang.Symbol`。
1个回答

9

可重复性为名,最好在本地maven仓库中安装该jar,并将其添加到project.clj:dependencies中,这样可以从那里获取。但是你说这些jars不会被maven管理,所以我们可以这样做:

defproject是一个宏,它允许使用解引用进行任意评估。它通过调用内部函数unquote-project来实现。因此,您可以执行以下操作:

:resource-paths [~(str (System/getenv "HOME") "/dist/mason/jar/mason.19.jar")]

感谢提供可重复性链接。将来我会考虑在相关库中采用这种方法。目前,“unquote-project”解决方案非常有用,所以我非常感激。 - Mars

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