请在2024 Clojure现状调查中分享您的看法!

欢迎!请参阅关于页面了解更多这个平台的工作原理。

+5
tools.deps
重标记

目前,deps.edn的几个部分只在工作别名下才能使用。这意味着如果您想通过命令行执行,就必须这样做

clojure -Sdeps '{:aliases {:foo {...}}}' -(AMX):foo ...

(例如,工具的:replace-deps

如果能直接说

clojure -Salias '{...}' -(AMX) ...

那就更好了,这样您就不需要创建别名,也不必在{:aliases ...}中重复该名称。

注册地址:https://clojure.atlassian.net/browse/TDEPS-173

3 个回答

+2

这看起来像是一个回答,而不是一个问题——在什么情况下你想这样做?

当然,我知道的一个具体场景是想要运行一个不使用项目依赖项的工具,类似于

clojure -Sdeps '{:aliases {:a-tool {:replace-deps {my/tool {:mvn/version "..."}} :main-opts ["..."]}}}' -M:a-tool

或使用::exec-fn/:exec-args/-X等代替。

还有其他不涉及工具的使用场景吗?

by
我认为这个用例是特定的工具,因为意图是运行忽略任何项目 `deps.edn` 的东西。
0
by

另一种用例可能是运行一个 repl,并仅仅为此次执行添加一组 repl 特定的依赖...

clojure -Sdeps '{:aliases {:dev {:extra-deps { ... }}}' -A:dev
by
在这种情况下,您只需使用 -Sdeps '{:deps { ... }}' 不是吗?

使用额外路径运行一个 REPL 也是一个用例(因为 :paths 覆盖了项目路径,所以您需要 :extra-paths,它必须位于别名中)。

这将纯粹是一种便利,允许更少的键入,对于人们似乎一直在嘤嘤嘤地抱怨的情况,自从 Clojure CLI 出现以来。

是的,这主要是关于在项目中运行临时工具,您不想将其添加到项目的deps.edn或您的用户的deps.edn中。
by
是的,我想你只是在那种情况下合并依赖。
0
by
编辑了 by

截至目前,我在当前基于别名的方案中遇到了2个问题

  1. 如果项目 deps.edn 无效,工具将失败,不管工具是否想使用它
  2. :replace-deps 不足以尝试忽略项目 deps.edn 的影响
    • 项目 deps.edn 设置的路径可能会影响工具的运行,比如位于常用 src 文件夹下的 user.cljdata_readers.clj
    • 目前可以通过指定 :replace-paths [] 来缓解这个问题,但这和多余的别名一样,也算是一种繁琐
    • :mvn/repos 也可能被考虑,并可能产生影响

编辑:第2点的重现案例

在以下仓库中:https://github.com/imrekoszo/depslink3_2#missing-replace-paths-repro-case

没有替换路径

> clojure -Srepro -Sdeps '{:aliases {:blank {:replace-deps {}}}}' -M:blank

Exception in thread "main" Syntax error compiling at (user.clj:1:1).
at clojure.lang.Compiler.load(Compiler.java:7648)
at clojure.lang.RT.loadResourceScript(RT.java:381)
at clojure.lang.RT.loadResourceScript(RT.java:368)
at clojure.lang.RT.maybeLoadResourceScript(RT.java:364)
at clojure.lang.RT.doInit(RT.java:486)
at clojure.lang.RT.init(RT.java:467)
at clojure.main.main(main.java:38)
Caused by: java.io.FileNotFoundException: Could not locate net/cgrand/xforms__init.class, net/cgrand/xforms.clj or net/cgrand/xforms.cljc on classpath.
at clojure.lang.RT.load(RT.java:462)...

替换路径

> clojure -Srepro -Sdeps '{:aliases {:blank {:replace-deps {} :replace-paths []}}}' -M:blank

Clojure 1.10.1
user=>
by
第2点是很有用的 - 我 hadn't thought of the possibility of a project's paths messing with tooling!

然而,这与我的问题正交:即使添加了“方便功能”来绕过指定 :aliases/:foo 和 -M:foo 的需要,你仍然需要记住同时指定 :replace-deps 和 :replace-paths - 也就是说,你仍然可能需要一个额外的“方便功能”,以说“只使用这些依赖,不要路径” - 我不确定需要覆盖路径的需求是否足够常见,以至于使其值得这样做?

编辑过
我明白你的观点,肖恩。我可能用这个网站的方式不对 :) 无论怎样,我只是想提高人们对这些问题的认识,以便在发布面向工具的更新之前可以考虑这些问题。

我想我可能要反过来问你的结尾问题 - 工具是否通常会用自己的依赖项替换项目的依赖项,但仍然使用项目的路径?我相信在大多数情况下,工具的开发者并不知道它将用于哪个项目,因此不应该期望能够从项目的本身路径中找到任何有用的内容。

对我来说,让`:replace-deps`意味着`:replace-paths []`(除非另外指定或类似的内容)似乎是有意义的。我将就这个问题提出一个单独的问题,因为它确实看起来是不同的。

编辑:在https://ask.clojure.org/index.php/9947/could-replace-deps-imply-replace-paths-by-default提出的问题
...