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 中的项目中运行 ad-hoc 工具。
是的,我想在这种情况下,您只需合并依赖即可。
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点是很有用的——我 hadn't thought of the possibility of a project's paths messing with tooling!

然而,它与我的问题无关:即使添加了“便利功能”来跳过指定 :aliases/:foo 和 -M:foo 的需要,你仍然需要记住指定 :replace-deps 和 :replace-paths ——也就是说,你仍然可能需要一个额外的“便利功能”来说“只使用这些依赖项和路径”,我不确定覆盖路径的需求是否足够常见,足以使这种功能有价值?
by
编辑 by
我懂你的意思,肖恩。我可能在使用这个网站时不正确 :) 无论如何,我只是想提高大家对这些问题的认识,以便在发布以工具为导向的更新之前考虑。

我认为我可能会逆转你的问题结尾——工具是否通常会用自己的依赖项替换项目的依赖项,但同时仍然使用项目的路径?我相信在大多数情况下,这个工具将是由不知道将要用于哪个项目的作者编写的,不应该期望从项目的自己的路径中找到任何有用的内容。

在我看来,除非有其他说明,否则让`:replace-deps`隐含`:replace-paths []`是有意义的。我将就此问题提出一个单独的问题,因为它确实似乎是不相干的。

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