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 可以工作。

我究竟做错了什么?

4

2 回答 2

3

我通过查看 codox 的来源找出了问题所在。

当插件拉取项目的地图时,它读取而不解释,因此输出路径不是设置为环境值而是设置为表单(environ.core/env :doc-dir)

但是,由于目标是将 codox 参数移动到 git 可以忽略的单独文件中,因此正确的方法是将带有硬编码值的 :codox 部分放在profiles.clj. Codox 会调查个人资料以及项目。

于 2021-10-27T21:11:22.233 回答
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使用 withcodox吗?如果您需要根据主机将生成的网页部署到不同的位置,我只需使用(甚至更容易使用scp代替cp)创建一个简短的 shell 脚本并进行一些if测试以确定目的地。

于 2021-10-27T20:26:38.210 回答