有没有办法以编程方式将我的主目录的名称插入到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`。
答案 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")]