请在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-pom、depot这样的工具来说不起作用,它们确实想要查看依赖项的版本。

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等价的选项
  • 隐含的匹配CLI如何读取的deps.edn文件的列表(这指的是为了允许在其他“询问”中提出的“额外的deps.edn文件”在这里 somehow 进行指定的一种弱言词法)

这里的想法是,工具希望模仿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 文件" 的部分 somewhat 相关,因为在当前情况下,尽管可以通过使用 -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 的变体表现得“就像”它只是某个别名的部分,并且工具会自动选择这个别名,那会很好。
...