Clojure 2024 调查问卷! 中分享您的想法。

欢迎!请在 关于 页面查看更多关于如何使用此页面的信息。

+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 (如有必要则进行编辑) 的 gist,那就太有帮助了。我理解编辑是必要的,但如果我能尽可能地接近原始内容,就会更容易理解所发生的情况。您也可以在 Clojurians Slack 或发送电子邮件。

您可能还会发现这个页面很有帮助,特别是在孤岛部分。
https://clojure.org/reference/dep_expansion

感谢您提供的参考资料,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]`)未包含在类路径中有关
...