请在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

编辑了

到目前为止,我在当前的基于别名的处理方法中遇到了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=>
第2点非常有用 -- 我 hadn't thought of the possibility of a project's paths messing with tooling!

然而,这与我的问题无关:即使在“便利功能”被添加以跳过指定 :aliases/:foo 和 -M:foo 的需要,你仍需要记住指定 :replace-deps _and_ :replace-paths -- 换句话说,你仍然可能需要一个额外的“便利功能”来说“只使用这些依赖项而没有路径”,我不确定需要覆盖路径的需求是否足够普遍,以至于使这变得有价值?

编辑
我明白你的观点,肖恩。我可能用这个网站的方法不正确 :) 无论如何,我只是尝试提高对这些问题的认识,以便在推出基于工具的更新之前能够考虑它们。

虽然如此,我认为我会颠倒你的结尾问题 - 工具替换项目的依赖项,但仍然使用项目的路径,这是常见的吗?我相信在大多数情况下,工具由不知道将用于其中项目的作者编写,不应期望从项目的路径中找到任何有用的内容。

如果未明确指定或类似的内容,我会觉得`:replace-deps`隐含`:replace-paths []`是合理的。我会就这件事单独提出一个问题,因为这确实似乎是相互独立的。

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