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参数。但根据工具的不同可能不大方便,获取一个解决版本别名的列表可能更好。”

对这里“提问”的澄清,并附上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文件(这实际上是一种模糊措辞,允许指定 elsewhere 那个 "ask" 中提出的 "额外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)

这是每个https://clojure.org/reference/deps_and_cli#_replace_project_environment_tool中的:replace-deps和:replace-paths背后的意图——你可以在你的用户级deps.edn或命令行中声明工具的别名,它将精确地使用这些依赖或路径(它并不完全符合你的建议,但应该基本上解决此用例)。
by
是的,这样就可以了。但是:a) 您需要一个别名,不能仅使用 -Sdeps 而不设置别名;b) 仍然会读取本地的 deps.edn,因此在该文件中存在的任何语法(以及可能的其他)错误都会导致工具无法运行,即使工具与本地 deps.edn 没有关联。
by
两者都是真的,我经常因为需要在 -Sdeps 中指定一个别名来绕过这个限制而感到烦恼。如果有一个 -Sdeps 的变体,它的行为“就像”它只是某个别名的部分,并且该别名可以通过工具自动选择,那将会很棒。
...