请在2024 Clojure 状态调查!分享您的看法。

欢迎!请参阅关于页面以了解更多关于这个站点的信息。

+6
tools.deps
重新标记

讨论来自Slack的副本

工具通常希望将deps.edn环境视为一系列别称,即工具希望以提供一组与运行工具所需的别称不同的别称来查看世界。

这涉及到-X.. mvn-pom如何工作,以及其他工具如depot(请参阅https://github.com/clojure/tools.deps.alpha/wiki/Tools)的工作方式:运行工具的环境并不相同于工具想要用于分析的环境。

depstar通过依赖自己的运行时环境与放入JAR文件中的相同,只是排除自己,来解决此问题。这主要是因为它是一个非常小的工具,没有外部依赖。您可以覆盖此设置并告诉depstar使用不同的类路径,但这种方法不适用于真正需要查看依赖项版本的工具,如mvn-pomdepot等。

Alex Miller说:“Datomic ion开发工具是另一个例子”

Michiel Borkent说:“我也有一些工具只是接收一个--classpath参数。但这取决于工具。对于mvn-pom来说,可能不是很方便,可能更容易获取用于解决版本号的别名列表。”

对这里询问的澄清,以及Alex提供的补充:此过程必须考虑CLI已经使用的各种deps.edn文件——系统、用户、项目、命令行——并且必须尊重相当于-Srepro的内容,以便如果用户希望的话可以省略用户deps.edn。此外,如果t.d.a增强了支持多个“项目”deps.edn文件,按照https://ask.clojure.org/index.php/9849/teams-common-dependencies-tooling-across-multiple-projects,那么此过程也应支持。

工具需要的是一种方式,通过它可以调用

  • 别名列表
  • 相当于-Srepro的选项
  • 以下列出了匹配CLI如何读取的deps.edn文件的隐式列表(这里的意图是要使用模糊词语来允许在该“其他请求”中提出的“额外的deps.edn文件”在此处以某种方式指定

这里的想法是工具要模仿Clojure CLI处理deps.edn文件以及别名和某些其他选项的方式,但当前由t.d.a公开的API过于低级,无法轻松实现这一点,我们也不希望基于t.d.a的每个工具都重复所有那些多文件合并和别名选择。

3 答案

+1投票

选择了
太好了!谢谢!
0 投票

编辑

您可以将tools.deps用作库

(require '[clojure.tools.deps.alpha :as deps]
         '[clojure.java.io :as io])

(let [aliases [:repl :dev]
      deps (deps/slurp-deps (io/file "deps.edn"))]
  (-> deps
      (deps/calc-basis
        {:resolve-args (deps/combine-aliases deps aliases)
         :classpath-args (deps/combine-aliases deps aliases)})
      :classpath
      keys))
; => ...classpath for given aliases

如果mvn-pom和其他构建工具接受基础而非别名单,则对工具生态系统会更好,并且别名单+deps.edn到基础的转换应在工具边缘的一个地方完成。

这不是对这个问题的回答(我已经知道如何使用tools.deps.alpha)。
0 投票

编辑

我想这仅与这个部分的“deps.edn文件的列表”略有相关,即虽然目前可以通过使用-Srepro来忽略用户deps.edn,但没有类似的方式来忽略当前工作目录中可能存在的任何本地(项目)deps.edn。对于一些工具调用,可能需要有此类机制。

编辑:这已被记录在https://ask.clojure.org/index.php/9857/could-option-that-variant-sdeps-avoid-having-specify-alias(感谢Sean)

这就是 :replace-deps 和 :replace-paths 的目的,如 https://clojure.org/reference/deps_and_cli#_replace_project_environment_tool 中所述——你可以在用户级别的 deps.edn 或命令行中声明工具的别名,然后它将使用这些确切的依赖/路径(它不完全符合你的建议,但应该主要用于解决这种情况)。
是的,这样是可行的。但是:a) 你需要一个别名,不能只使用-Sdeps而不设置别名;b) 仍然会读取本地的 deps.edn 文件,所以该文件中的任何语法错误(以及可能的其他错误)都会导致工具运行失败,即使工具与本地deps.edn无关。
确实是这样,我经常因为不得不在-Sdeps中指定别名以绕过限制而感到苦恼。如果有-Sdeps的变体,其行为就像只是某个别名下的部分一样,并且该别名由工具自动选择,那就很好了。
...