请分享您的看法,参加 2024 年 Clojure 状态调查!

欢迎!请参阅 关于 页面获取更多有关如何使用本站的信息。

+5
tools.deps
重新标记

目前,“deps.edn” 中有几个部分只在别名下工作。这意味着如果您想通过命令行做这件事,您必须这样做

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

(例如,tooling 的 :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依赖...

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 _and_ :replace-paths - 也就是说,你仍然可能需要一个额外的“便利功能”来说“只用这些依赖项,没有路径”,而我并不确定需要覆盖路径的需求是否足够普遍,以至于使其值得这样做?

编辑
我理解你的观点,Sean。我可能在使用这个网站的时候有些不当 :) 无论如何,我只是试图提高对这些问题的认识,以便在发布以工具为导向的更新之前考虑。

我认为我需要反转你的结尾问题——工具是否通常用它们自己的依赖代替项目的依赖,但仍然使用项目的路径?我相信在大多数情况下,工具将被编写而不了解它们将使用的项目,并且不应期望从项目的自身路径中找到任何有用的东西。

在我看来,如果未指定或类似情况,则 `:replace-deps` 应意味着 `:replace-paths []`。我将就这一点另开一个问题,因为它确实似乎是不相关的。

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