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

时间:2015-06-22 16:59:53

标签: clojure leiningen

有没有办法以编程方式将我的主目录的名称插入到Leiningen的project.clj的文件路径中?

我在不同的机器上运行Leiningen项目,我有不同的主目录。该项目使用不由Maven管理的jar文件;我下载'em并将它们放在一个与我的主目录相关的目录中,或者将它们复制到Leiningen项目中。第二种选择有效但不可取。

使用第一个选项的简单方法 - 将jar文件保存在其他位置 - 是在我的Leiningen目录中的“somewhere”目录中添加一个软链接。这是有效的,但每台机器上的链接必须不同,所以我不能在git存储库中包含链接文件,而是宁愿将所有内容都包含在git repo中。

我的project.clj文件中是否有使用环境变量或以其他方式引用我的主目录的方法?到目前为止,我已经完成了sample project file并且还没有找到解决方案。

我以为我可以在运行时构建路径字符串 - 毕竟,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 个答案:

答案 0 :(得分:7)

repeatability的名义,您最好在本地maven存储库中安装jar并将其添加到project.clj :dependencies,以便从那里获取。但你说这些罐子不是由maven管理的,所以我们走了:

defproject是一个宏,它允许使用unquoting进行任意评估。它通过调用内部fn unquote-project来实现。所以你可以做到以下几点:

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