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

欢迎!请参阅 关于 页面,了解更多关于该应用程序的信息。

+2
工具

问题

当项目使用自定义 Maven 仓库时,无法依赖基于 deps.edn 的项目使用 git 或本地依赖。尝试为依赖于此类项目的项目构建类路径将失败。

重现

我创建了一个最小化仓库来演示此问题:https://github.com/vlaaad/deps-mvn-repos-repro

它包含 3 个 deps.edn 仓库:lib、app-local 和 app-git。

lib 包含一个单独的 deps.edn 文件,其中定义了一个自定义 Maven 仓库以及从该仓库获取的依赖。

app-local 包含一个单独的 deps.edn 文件,其中定义了对 lib 的 :local/root 依赖。

app-git 包含一个单独的 deps.edn 文件,其中定义了对 lib 的 :git/url 依赖。

预期行为

在 lib、app-local 和 app-git 项目中运行 clj -P 应该成功。

实际行为

运行 clj -P 仅在 lib 项目中成功,在 app-local 和 app-git 项目中失败,错误为 "构建类路径错误。在中心(https://repo1.maven.org/maven2/)找不到工件 net.sf.saxon:saxon-dom:jar:9.1.0.8"。

1 个答案

+1
by

我的理解是,这是按照设计来的,出于安全考虑,这样你就不会依赖于某个项目,而该项目会随机截获依赖项的来源:你应该能够控制所有依赖项来自哪些仓库。

如果你依赖的东西又依赖于非标准仓库中的东西,那么这取决于你决定其是否安全,如果是的话,可以将其明确定义到自己的 deps.edn 中,按照适当的顺序。

这就是我的理解。我很想听到官方的回答。

by
我们目前就是这种情况,但可能会改变。

https://clojure.atlassian.net/browse/TDEPS-46存在相同的概念问题
by
肯定不希望那个Maven仓库覆盖我的依赖,但拉取中央/clojars中不存在的东西将是受欢迎的...
by
安全性是一个很好的理由,不要自动这样做。虽然工具可以在这个低风险的地方提供帮助,比如遍历依赖项树,并列出它们尝试添加的 Maven 仓库,或许还能看到哪个依赖项试图这样做。
by
这可能适合每个单独的依赖项,因为有些合法的情况你会想要这样做。

我会给你一个具体的例子

在Metabase中,我们将Amazon Redshift扩展作为一个独立的 `:local/root` 子项目;亚马逊有自己的Redshift JDBC驱动程序仓库。理想情况下,我们只需在子项目中添加自定义的 `:mvn/repos`,然后在包含它时将其拉入主项目。目前,我们必须复制仓库路径并在两个地方指定 `:mvn/repos`。

如下所示:

```
{:extra-deps
 {metabase/redshift {:local/root "modules/drivers/redshift", :mvn/include-repos true}}}
```

我认为这样可以工作
...