请在 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,并添加一组专门为这次执行 profile 的REPL依赖...

clojure -Sdeps '{:aliases {:dev {:extra-deps { ... }}}' -A:dev
在这种情况下,您可以直接使用-Sdeps '{:deps { ... }}',对吧?

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

这将纯粹是为了方便,允许人们少打字,这在clojure CLI出现以来,人们一直在抱怨。

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

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

  1. 如果项目deps.edn无效,工具将失败,不管工具是否想使用它
  2. :replace-deps不足以尝试忽略项目deps.edn的影响
    • 项目deps.edn设置的路径可能仍然会影响工具的运行,例如在常用src文件夹下的一个user.clj,或者一个data_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 - 换句话说,您仍然可能需要一个额外的“便利功能”,以便说“只使用这些依赖,不使用路径”,我不确定需要覆盖路径的需求是否足够常见,以便使其有价值?
by
编辑 by
我明白你的观点,Sean。我可能没有正确使用这个网站 :) 在任何情况下,我只是想提高人们对这些问题的认识,以便在发布以工具为导向的更新之前进行考虑。

我想我可能要反转你最后的疑问——工具是否普遍用它们自己的依赖项替换项目的依赖项,但仍然使用项目的路径?我相信在大多数情况下,工具将与对它们将用于其中的项目一无所知的方式编写,因此不应该期望从项目的自己的路径中找到任何有用的东西。

对我来说,将`:replace-deps`隐含`:replace-paths []`是有意义的,除非否则指定或类似这样。我将就这个问题提出一个单独的问题,因为它确实似乎不相关。

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