2024 Clojure状态调查中分享你的看法!

欢迎!请参阅关于页面获取更多有关此产品的工作方式的信息。

+6 投票
tools.deps
重标记

讨论内容来自Slack

工具通常需要读取 Demp.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 已经使用的各种《 dép edn》文件—系统、用户、项目、命令行—并且必须遵守相当于《-Srepro》的设置,以便在需要的情况下省略用户的《 dép edn》。此外,如果 t.d.a 增强到支持多个“项目”《 dép edn》文件,根据 https://ask.clojure.org/index.php/9849/teams-common-dependencies-tooling-across-multiple-projects,此过程也应该支持这种方式。

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

  • 别名列表
  • 等同于 -Srepro 的选项
  • 隐式列表的 deps.edn 文件,该列表与 CLI 读取的方式相匹配(这原本是为了对这些“额外 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

编辑

我想这与“Dependency.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 的变体,它的行为就像是只有某个别名的一部分,并且这个别名会自动由工具选择,那就太好了。
...