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 特定依赖...

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

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

这将纯粹是一种便利,为了允许输入更少,针对人们对 Clojure CLI 出现以来不断抱怨的情况。

是的,这主要是关于在不希望将其添加到项目的 deps.edn 或您的用户 deps.edn 的情况下,在项目中运行即兴工具。
没错,我认为在这种情况下只会合并依赖项。
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和:replace-paths——换句话说,你仍然可能需要一个额外的"便利功能"来说明"只使用这些依赖和路径",我不确定需要覆盖路径的需要是否足够普遍以达到这个效果?

编辑
我理解你的观点,Sean。我可能错误地使用了这个网站 :) 无论如何,我只是想提高对这些问题的认识,以便在发布以工具为导向的更新之前进行考虑。

我想我可能要反转你的结尾问题——工具是否常见地用自己的依赖项替换项目的依赖项,但仍然使用项目的路径?我相信在大多数情况下,工具在不知道要用于哪个项目中编写时,不应该期望从项目的自己的路径中找到任何有用的东西。

在我看来,如果默认不指定,就应使 `:replace-deps` 暗示 `:replace-paths []` 或者类似的内容。我将为这个问题单独提出一个问题,因为这似乎确实是正交的。

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