【问题标题】:How to reference environmental variable or home dir in project.clj如何在 project.clj 中引用环境变量或主目录
【发布时间】:2015-06-22 16:59:53
【问题描述】:

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

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

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

难道没有办法在我的 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”。

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您提供可重复性链接。我会考虑在未来为有问题的图书馆朝着这个方向发展。不过,目前unquote-project 的解决方案非常有用,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2021-10-07
    • 2021-12-13
    相关资源
    最近更新 更多