在Leiningen的project.clj中使用environ访问环境变量时出错。

3

我正在尝试使用environ 1.2.0在project.clj中创建环境变量以供codox使用,但未能成功。

我在profiles.clj中有以下内容:
{:dev {:env {:doc-dir "/home/me/some/dir"}}}

到目前为止,一切正常:.line-env已正确创建,我可以在repl中获取值。 然而,我无法在project.clj中获取该值。

(defproject ....

  :codox {:output-path (environ.core/env :doc-dir) })

我从lein codox获得了一个错误:

Syntax error (IllegalArgumentException) compiling at (/tmp/form-init13693313479173922228.clj:1:74). 
No implementation of method: :as-file of protocol: #'clojure.java.io/Coercions found for class: clojure.lang.PersistentList 

如果我移除对environ.core的调用,codox就能正常工作。

我错在哪里了?

2个回答

3
我通过查看codox源代码解决了这个问题。
当插件读取项目地图时,它不会进行解释,因此输出路径未设置为环境变量值,而是设置为 (environ.core/env :doc-dir) 的形式。
然而,既然目标是将codox参数移动到一个Git可以忽略的单独文件中,正确的方法只需在profiles.clj的开发配置文件中放置:codox段,带有硬编码的值。Codox将查看配置文件以及项目。

1

我经常使用 codox,但通常只接受默认的输出目录。 我尝试了以下实验:

  ; Using `lein-ancient check :all` checks plugins
  :plugins [
            [lein-codox "0.10.7"]
            [com.jakemccrary/lein-test-refresh "0.24.1"]]

  :codox {:src-dir-uri                "http://github.com/cloojure/tupelo/blob/master/"
          :src-linenum-anchor-prefix  "L"
          :source-paths               ["src/clj" "src/cljc"]
          :language                   :clojure
          :namespaces                 [#"^tupelo\."]
          :exclude-vars               #".*IntervalClosed|.*SpliceItem|map->[A-Z].*"
          :output-path                "docs/out/codox" }

请注意,这适用于Java11(OpenJDK11),但在Java17上会出现模块/反射错误。
您真的需要使用environ来配合codox吗?如果您需要将生成的网页部署到不同的位置取决于主机,我建议您只需创建一个短的shell脚本,使用scp而不是cp更容易,并放置一些if测试以确定目标。

你说得对,我不需要 environ。但是请看下面的答案,这才是正确的方法。 - gash

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