请在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

但是,由于:missing-parent,依赖“[my-company/my-lib [5] -> my-company/base-lib [1] -> general/some-lib [1.0] -> general/some-other-lib [1.0]]”将被“拒绝”,因为“[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 捕获跟踪,并发送跟踪.edn 的摘录(如有必要进行编辑)。我明白如果编辑是必要的,但越接近原始的,我理解发生的事情就越容易。您也可以在 Clojurians Slack 上发送 dm 或发送电子邮件,如果更合适的话。

您也可能觉得这个页面很有用,尤其是孤儿部分
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,但 dependencies' tree 不显示)。

不一致的行为发生在库 `tick/tick [0.7.5]` 和 `com.stuartsierra/dependency [1.0.0]`(来自 `com.stuartsierra/components [1.1.0]`)没有被包含在类路径中的时候
...