有没有办法以编程方式将我的主目录的名称插入到Leiningen的project.clj的文件路径中?
我在不同的机器上运行Leiningen项目,我有不同的主目录.该项目使用不由Maven管理的jar文件; 我下载'em并将它们放在一个与我的主目录相关的目录中,或者将它们复制到Leiningen项目中.第二种选择有效但不可取.
使用第一个选项的简单方法 - 将jar文件保存在其他位置 - 是添加软链接到Leiningen目录中的"somewhere"目录.这是有效的,但每台机器上的链接必须不同,所以我不能在git存储库中包含链接文件,而是宁愿在git repo中包含所有内容.
有没有办法在我的project.clj文件中使用环境变量,或以其他方式引用我的主目录?到目前为止,我已经浏览了示例项目文件并找不到解决方案.
我以为我可以在运行时构建路径字符串 - 毕竟,project.clj中的内容只是Clojure代码.由于将我的主目录硬编码到project.clj中没有任何问题:
:resource-paths [/Users/myhomedir/dist/mason/jar/mason.19.jar")]
Run Code Online (Sandbox Code Playgroud)
我想我能做到这一点:
:resource-paths [(str (System/getenv "HOME") "/dist/mason/jar/mason.19.jar")]
Run Code Online (Sandbox Code Playgroud)
然而,Leiningen完全不喜欢这样:
java.lang.IllegalArgumentException: No implementation of method: :as-file of protocol: #'clojure.java.io/Coercions found for class: clojure.lang.PersistentList
Run Code Online (Sandbox Code Playgroud)
更改[...]
为(vector ...)
给出相同的错误,但最后使用'clojure.lang.Symbol`.
以可重复性的名义,你最好将jar安装在本地maven资源库中,并将它添加到project.clj中,:dependencies
以便从那里获取它.但你说这些罐子不会由maven管理,所以我们走了:
defproject
是一个宏,它允许使用unquoting进行任意评估.它通过调用内部fn unquote-project来实现.所以你可以做到以下几点:
:resource-paths [~(str (System/getenv "HOME") "/dist/mason/jar/mason.19.jar")]
Run Code Online (Sandbox Code Playgroud)