2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面,了解更多关于此平台的信息。

+6
工具.deps
重新标记

从 Slack 复制的讨论

工具通常希望读取 deps.edn 环境作为一组别名,也就是说,工具想要看到的是一个特定的别名集合,这组别名与运行工具所需的别名不同。

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

通过依赖于其自己的运行时环境与放入 JAR 文件中的环境相同但排除自身的方式,“depstar”绕过此问题。这仅仅可行,因为这个工具很小,没有外部依赖。您可以覆盖这一点,并告诉 depstar 使用不同的类路径,但是这种方法对于真正想要查看依赖项版本的工具,如 mvn-pomdepot 等并不有效。

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

Michiel Borkent 说:“我也有几个只接受 --classpath 参数的工具。但是对于 mvn-pom,这样可能不太方便,用别名解析版本的列表可能会更好。”

对这里的“提问”进行澄清,以及 Alex 的补充:此过程必须考虑 CLI 已经使用的各种 deps.edn 文件--系统、用户、项目、命令行--并且必须尊重 -Srepro 的等效项,以便用户 deps.edn 可以被省略,如果需要的话。此外,如果 t.d.a 通过 https://ask.clojure.org/index.php/9849/teams-common-dependencies-tooling-across-multiple-projects 优化以支持多个“项目”deps.edn 文件,则此过程也应支持这一点。

工具需要的,是它们可以在 t.d.a 中调用的某个东西

  • 别名列表
  • 相当于 -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 和其他构建工具接受一个基础(basement)而不是别名列表,那么将别名+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)

这是每个 https://clojure.org/reference/deps_and_cli#_replace_project_environment_tool:replace-deps:replace-paths 的目的 —— 您可以在您的用户级别的 deps.edn 或命令行中声明工具的别名,并且它将使用恰好那些依赖和路径(这并不是你建议的,但应该主要解决这个用例)。
by
是的,这样也行。然而:a) 你需要一个别名并且不能 just -Sdeps 不设置别名 b) 仍然会读取本地的 deps.edn,因此文件中的任何语法(和可能的其它)错误会导致该工具无法运行,即使工具与该局部 deps.edn 没有关系。
by
两者都是真的,我经常对此感到烦恼,因为必须指定一个别名来实现 -Sdeps 的限制。如果有一种 -Sdeps 的变体,它的行为“好像”只需要处理某些别名的部分,并且该别名能够由工具自动选择,那会很好。
...