请分享您的想法,参加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的选项
  • 与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 和其他构建工具接受基而不是别名列表,那么对于工具生态系统来说会更好。将别名+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)

这就是 :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 的变体,它在某种程度上表现得“像一个”某些别名的部分,并且该别名被工具自动选择,那就太好了。
...