请在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的等效方法。

除了工具之外,还有其他用例吗?

我认为这个用例是针对工具的,因为意图是不考虑任何项目`deps.edn`。
0

另一个用例可能是运行repl,只为这次执行添加一组repl特定的deps...

clojure -Sdeps '{:aliases {:dev {:extra-deps { ... }}}' -A:dev
在这种情况下,你是否可以使用-Sdeps '{:deps { ... }}'?

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

这纯粹是一种便利,为了减少输入,对人们似乎一直有抱怨的情况。

而且,是的,它主要是在项目中运行临时的工具,你不想将其添加到项目的deps.edn或用户的deps.edn中。
确实,我想你只需要将deps合并即可。
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点是很有用的 - 我没有想过项目路径可能会影响工具的问题!

然而,这与我的问题无关:即使添加了“方便功能”来绕过指定 :aliases/:foo 和 -M:foo 的需要,您仍需要记住指定 :replace-deps 和 :replace-paths——换句话说,您可能还需要一个额外的“方便功能”来指定“仅使用这些依赖项,不使用路径”,我不确定需要覆盖路径的需求是否足够常见,以至于这样做是值得的?
by
编辑了 by
我同意你的观点,Sean。我可能在这个网站上使用不正确 :) 无论如何,我只是试图提高人们对这些问题的认识,以便在发布面向工具的更新之前加以考虑。

我认为我可能会Reverse你的结尾问题 - 是不是工具通常会用自己的依赖项替换项目依赖项,但仍使用项目的路径?我认为在大多数情况下,工具作者对将使用的项目不了解,不应该期望从项目自己的路径中找到任何有用的内容。

如果有其他指定,使得`:replace-deps`暗示`:replace-paths []`是有意义的。我将就这一点打开一个单独的问题,因为这似乎确实是正交的。

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