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

欢迎!请参阅 关于 页面以了解此功能的工作原理。

+1
tools.deps
编辑

正如标题所说的,clj -X:deps tree 忽略了 -Sdeps 选项

$ clj -Sdeps '{:deps {ring/ring-core {:mvn/version "1.9.1"}}}' -X:deps tree
org.clojure/clojure 1.10.2
  . org.clojure/spec.alpha 0.2.194
  . org.clojure/core.specs.alpha 0.2.56

clj -Stree 相比

$ clj -Sdeps '{:deps {ring/ring-core {:mvn/version "1.9.1"}}}' -Stree
org.clojure/clojure 1.10.2
  . org.clojure/spec.alpha 0.2.194
  . org.clojure/core.specs.alpha 0.2.56
ring/ring-core 1.9.1
  . ring/ring-codec 1.1.3
    . commons-codec/commons-codec 1.15
  . commons-io/commons-io 2.6
  . commons-fileupload/commons-fileupload 1.4
    X commons-io/commons-io 2.2 :older-version
  . crypto-random/crypto-random 1.2.0
    X commons-codec/commons-codec 1.6 :older-version
  . crypto-equality/crypto-equality 1.0.0

这是否是预定的行为?如果是,为什么?

我认为这是故意的,因为我发现这种行为来自 这个看似故意的变更,但我仍然不明白原因。

顺便提一下,如果我想以任何方式使用 clj -X:deps tree,我知道有一个解决方案如下

$ clj -Sdeps ... -Strace
$ clj -X:deps tree :file '"trace.edn"'

3 个答案

+2

选为最佳答案
 
最佳答案

是的,这种行为是有意为之的。当以 -X:deps 程序运行时,你正在运行一个工具,任何命令行上的类路径选项都应用于程序,而不是应用于程序计算的树。

我们仍在讨论如何将classpath修改选项传递给自身运行的-X:deps程序,可能还需要一套标准的选项集,或者为计算classpath基础的应用程序提供lib支持。

感谢您的回答!这个回答非常有道理。

> 当作为-X:deps程序运行时,你是在运行一个工具,任何你在命令行上使用的classpath选项都会作用于程序本身,而不是作用于程序计算的树。

这意味着,一般来说,第三方-X:deps程序(比如库)不应该依赖于运行时基础?
-X程序在工具调用时会注入运行时基础。该基础将基于您通过别名指定的工具classpath。如果使用:replace-deps,则项目基础不会通过clj选项包含(或修改)。如果使用:extra-deps(例如,一个增强项目classpath而不是替换它的测试运行器),则该基础可能很有用。所以......这取决于。
啊,我懂了(我发现我有点把"-X:deps程序"和"-X程序"搞混了)。谢谢您详细讲解!
+2

自版本0.12.1148以来,-X:deps树需要基础设置。

$ clj -X:deps tree :extra '{:deps {ring/ring-core {:mvn/version "1.9.1"}}}'
org.clojure/clojure 1.11.1
  . org.clojure/spec.alpha 0.3.218
  . org.clojure/core.specs.alpha 0.2.62
ring/ring-core 1.9.1
  . ring/ring-codec 1.1.3
    . commons-codec/commons-codec 1.15
  . commons-io/commons-io 2.6
  . commons-fileupload/commons-fileupload 1.4
    X commons-io/commons-io 2.2 :older-version
  . crypto-random/crypto-random 1.2.0
    X commons-codec/commons-codec 1.6 :older-version
  . crypto-equality/crypto-equality 1.0.0

您还可以传递例如别名列表,这非常有用。

$ clj -X:deps tree :aliases '[:dev :test]'
+1

这与t.d.a.的几个其他决策以及多个明确的设计目标保持一致。

我最近在这个区域的 depstar 方面经历了一次(很大的)变化:在1.0流中,它使用了运行时/注入基础,某些事情容易,但某些事情却不可能;而在2.0流中,它使用了项目基础,现在一切都是可能的,但某些以前容易的事情现在变得稍微有点困难。

对我来说,这是一个非常清晰的解耦。

(顺便说一下,我编辑了标题和描述,使用 -X:deps 而不是 -Xdeps,这是正确形式)

...