请在2024 Clojure现状调查!中分享您的想法。

欢迎!请参阅关于页面,了解更多关于此项工作的情况。

+6
tools.deps
重标记

讨论内容来自Slack

工具通常会读取 deps.edn 环境,就像它在一系列别名下一样,即工具希望看到似乎提供了一组特定别名,这组别名与运行工具所需的别名不同。

这涉及到 -X.. mvn-pom 的工作原理,以及https://github.com/clojure/tools.deps.alpha/wiki/Tools上的其他工具(如depot)的工作原理:运行工具所需的体系结构与工具希望用于分析的环境并不相同。

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,则此过程也应支持。

工具需要的是t.d.a中他们可以调用的某种东西

  • 别名列表
  • -Srepro 相等的选项
  • 隐含的匹配CLL(命令行界面)读取方式的 deps.edn 文件列表(目的是用模糊的语言来允许某种“额外的 deps.edn 文件”在该其他“提问”中以某种方式在此处指定)

这里的想法是,工具想要模仿Clojure CLI处理 deps.edn 文件、别名和某些其他选项的方式,但t.d.a当前暴露的API过于底层,难以实现,我们也不希望基于t.d.a的每个工具都不得不重复所有多文件合并和别名选择。

3 个答案

+1
by
被选中 by
by
非常好!谢谢!
0
by
编辑了 by

你可以将 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 和其他构建工具接受一个基础而不是一组别名,并且在工具边缘的单个位置进行别名加 dependencies.edn 的转换,这将更有利于工具生态系统。

by
这并不是对这类问题的回答(而且我已经知道如何使用 tools.deps.alpha)。
0
by
编辑 by

我认为这仅与 "list of deps.edn files" 的部分有些许关联,即尽管目前可以通过使用 -Srepro 忽略用户 deps.edn,但没有类似的方法来忽略当前工作目录中可能存在的任何本地(项目)deps.edn文件。在某些工具调用中,可能需要提供这样的机制。

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

by
:replace-deps 和 :replace-paths 每个的意图是为了 https://clojure.org/reference/deps_and_cli#_replace_project_environment_tool -- 你可以在用户级别的 dependencies.edn 中或在命令行中声明工具的别名,它将确切地使用那些依赖/路径(它并不完全是你在建议的,但应该可以解决这个用例的大部分问题)。
是的,这确实有效。但是:
两者都是真的,我常常对此处的限制感到烦恼,必须指定别名才能绕过限制。如果有一个 -Sdeps 的变体,表现得“就像”它只是某些别名的部分,并且这个别名由工具自动选择,那将会很棒。
...