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等效的选项
  • 隐式列表的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 到基础的转换会更合适。

这并不是针对这个问题的答案(而且我 already know how to use 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)

by
:replace-deps 和 :replace-paths 的背后意图是这样的,参见 https://clojure.org/reference/deps_and_cli#_replace_project_environment_tool。你在用户级别的 deps.edn 或命令行中声明一个工具的别名,它将使用 exactly 那些依赖/路径(它并不完全符合你的建议,但应该基本解决该用例)。
by
是的,这样是可行的。然而:a) 你需要一个别名,并且不能仅仅使用 -Sdeps 而不设置别名;b) 还是会读取本地的 deps.edn,因此在这个文件中的任何语法(以及可能的其它)错误都可能导致工具无法运行,即使这个工具与本地 deps.edn 没有直接关系。
by
两者都是真的,我常常对必须在使用 -Sdeps 时指定别名而感到不满。如果有一个 -Sdeps 的变体,其功能就像是在某个别名下的部分一样,并且该别名可以由工具自动选择,那会很好。
...