请分享您的想法,参与 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
by
编辑 by

迄今为止,我在当前的基于别名的做法中遇到了两个问题

  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=>
by
第2点非常有用 - 我 hadn't 考虑过项目路径会干扰工具的可能性!

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