请分享您的观点,参与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,那么此过程还应支持这一点。

工具需要的只是一个可以通过以下方式调用的东西

  • 别名列表
  • -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 和其他构建工具接受基(basis)而非别名列表,并在工具边缘的单一位置将别名+deps.edn 转换为基,这将更好。

这不是这个问题的答案(我已经知道如何使用 tools.deps.alpha)。
0

编辑

我想这与此处的 "deps.edn 文件列表" 部分略有相关,因为在目前的情况下,虽然可以忽略用户的 deps.edn 以使用 -Srepro 参数,但是没有类似的方式来忽略当前工作目录中可能存在的任何本地(项目)的 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 或命令行中声明工具的别名,它将使用这些确切的依赖关系/路径(它并不完全是你在建议的东西,但应该主要解决这个问题)。
是的,这样是可行的。但是:a) 你需要一个别名,并且不能在不对别名进行设置的情况下使用 -Sdeps;b) 仍然会读取 local deps.edn,这意味着在该文件中存在的任何语法错误(以及潜在的其它错误)会导致工具无法运行,即使该工具与local deps.edn无关。
这两个问题的说法都是正确的。我经常因为需要为 -Sdeps 指定别名以绕过这一限制而感到烦恼。如果有一个 -Sdeps 的变体,其行为仿佛只是某些别名下的部分,并且该别名由工具自动选择,那就很棒了。
...