2024年的Clojure状态调查!中分享您的观点。

欢迎!请参阅关于页面了解此工作的更多详细信息。

+3
tools.deps
编辑

你好。

我正在使用Clojure 1.11.1(以及org.clojure/tools.deps "0.18.1354"),但我遇到了传递依赖解析的问题:一些依赖没有被包括在类路径中。

导致此问题的简化场景如下

“依赖树”

my-company/my-lib :mvn/version 5
  |_ my-company/base-lib :mvn/version 1
       |_ general/some-lib :mvn/version 1.0
            |_ general/some-other-lib :mvn/version 1.0

my-company/another-lib :mvn/version 3
  |_ my-company/base-lib :mvn/version 2
       |_ general/some-lib :mvn/version 1.0
            |_ general/some-other-lib :mvn/version 1.0

发生的问题是

传递依赖展开/解析逻辑

add: [my-company/my-lib [5] -> my-company/base-lib [1] -> general/some-lib [1.0]]
add: [my-company/my-lib [5] -> my-company/base-lib [1] -> general/some-lib [1.0] -> general/some-other-lib [1.0]]
add: [my-company/my-lib [5] -> my-company/base-lib [2] -> general/some-lib [1.0]]  <== when this arrives the "children" [general/some-other-lib] is not added to the queue because the [general/some-lib [1.0]] has already been "seen" and previously added

然而,依赖“[my-company/my-lib [5] -> my-company/base-lib [1] -> general/some-lib [1.0] -> general/some-other-lib [1.0]]”将会被“拒绝”,因为这有一个 :missing-parent 的错误,因为 "[my-company/my-lib [5] -> my-company/base-lib [1] -> general/some-lib [1.0]]" 被替换为 "[my-company/my-lib [5] -> my-company/base-lib [2] -> general/some-lib [1.0]]"(my-company/base-lib 的新版本)。不幸的是,队列中没有为 general/some-lib [1.0] 的条目,因为它之前被跳过添加,因为它的直接父类 general/some-lib [1.0] 已经被添加(尽管来自不同的“绝对”路径”)。
然后我的项目失败,因为无法在类路径中找到 general/some-other-lib [1.0] 的类/命名空间,因为这个库没有被包含在类路径中。

经过一点调试,我发现问题似乎出在这部分代码中
https://github.com/clojure/tools.deps/blob/master/src/main/clojure/clojure/tools/deps.clj#L230-L240

1 个答案

0

这个描述对我来说没有意义 - 在两个分支中 "general/some-lib :mvn/version 1.0" 都存在,应该与它自己的传递依赖一起包含,所以感觉在这个过程中丢失了某些内容。特别是,我也想知道在树中的任何地方是否有 :exclusions。

如果您能将依赖树缩小到上面的等效内容,用 -Strace 捕获一个跟踪,并发送一个 trace.edn 的蜘蛛(如果需要则进行编辑)。我理解如果需要进行编辑,但越接近原始内容,我就越能理解发生了什么。您还可以通过 Clojurians Slack 或电子邮件发送 dm,如果那样更方便。

您可能也会发现这个页面很有用,尤其是孤儿部分
https://clojure.org/reference/dep_expansion

by
感谢您的参考资料,Alex。它帮助我定位了造成我问题的原因。
(编辑是为了简化,因为大多数库都属于我的公司内部,所以显示或不对它们的名称都是一样的,因为它们都不是公开可用的)

我的问题是由于第三级依赖项上的 `:exclusion` 引起的
my-bundle > my-component > my-lib
"my-lib" 在 "deps.edn" 中包含以下内容
     amazonica/amazonica                   {:mvn/version "0.3.165" :exclusions [com.taoensso/nippy]}
     com.taoensso/faraday                  {:mvn/version "1.12.0"  :exclusions [com.taoensso/nippy]}
     com.taoensso/nippy                  ^:antq/exclude {:mvn/version "3.1.1"}

移除 `:exclusions`(因为已经在这同一级别设置了 nippy 的一个版本),这使得其他库的古怪行为消失(尽管现在 IntelliJ 中的 Cursive 显示了两个 nippy 版本,3.1.1 和 3.2.0,但依赖树并没有显示)。

不一致的行为与 `tick/tick [0.7.5]` 和 `com.stuartsierra/dependency [1.0.0]`(来自 `com.stuartsierra/components [1.1.0]`)不包含在类路径中。
...