请在2024年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多有关此操作的信息。

+5
工具.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

编辑

到目前为止,我在现有的基于别名的方案中遇到了两个注意事项

  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点非常有用--我没想到项目的路径会影响工具的问题!

然而,这与我的问题无关:即使添加了一个“便利功能”来绕过指定 :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 提问
...