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

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

+3
tools.deps

这已在https://clojure.atlassian.net/browse/TDEPS-123?focusedCommentId=26919&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-26919中暗示

存在许多依赖项的仓库,其中该仓库中的依赖项相互依赖。目前还没有从设置如下所示的仓库中消耗依赖项的机制。

2 个回答

+1

在Liftoff(liftoff.io)中,我们有34个Clojure项目,代码量超过1百万行。我们使用了单仓库,并在从Leiningen切换到Clojure CLI工具时遇到了这个线程中描述的问题。

我认为可以通过在clojure.tools.deps.alpha.reader/slurp-deps中读取deps.edn文件时将相对路径转换为绝对路径来解决这个问题。这里有一个简短的补丁,建议修复:local/root坐标中的相对路径。

以下是我们的用例的完整描述

在单仓库中,Clojure CLI的config-dir deps.edn文件可能
包含库中其他部分的相对路径。

例如,让我们考虑以下单仓库。


config/
  clojure/
    deps.edn
tools/
  lint/
    deps.edn
    src/...
  B/
    deps.edn
    src/..
A/
  deps.edn
  src/...

假设我们想在
config/clojure/deps.edn中添加一个库范围的linting别名。


{:aliases
   {:lint {:extra-deps {acme/lint {:local/root ../../tools/lint}}
           :main-opts ["-m" "acme.lint.core"]}}}

开发人员在他们的shell配置中将CLJ_CONFIG设置为“config/clojure/deps.edn”。
Clojure linting代码位于“tools/lint/deps.edn”。

库中的所有项目中(例如,在“A/deps.den”,和
在 ""tools/B/deps.den"",我们希望 clojure -A:lint 能够运行
代码检查器。

然而,在目录A中执行 clojure -A:lint,会添加
"A/../../tools/lint/src" 到类路径中,而不是
"A/../tools/lint/src" 或 "/path/to/repo/tools/lint/src"。

感谢clojure团队多年来的出色工作!

我们还有一个包含几十个子项目的monorepo,我们仅使用CLI/deps.edn。

我们采取的措施是确保所有子项目都位于从repo根目录相同深度的地方,然后所有的相对路径都正常工作,假设你在子项目文件夹(包含本地deps.edn)中运行clojure,并使用CLJ_CONFIG=../../path/to/config作为包含control/default/override deps.edn文件夹的相对路径。

将所有子项目置于相同深度使得工具变得更加简单,因为只需给出子项目名称,任何其他子项目就可以预测其(相对)路径。

话虽如此,我认为解决 :local/root 的 "相对于 deps.edn 文件" 方面会方便许多用户。
我理解你的立场,但这种方法似乎不是最好的解决方案(可能会导致其他相对解析问题)。
Alex,请让我澄清一下,:local/root 路径被认为是相对于它们所在的 deps.edn 绝对路径,还是仍然是相对于执行 clojure 的项目?

我对历史不太清楚,但我觉得它曾经是后者,并且被认为是错误,我不知道是否有行为上的改动?

对于我们来说,这无所谓:我们的 :local/root 路径是相对路径,当我们在子项目中运行 clojure 时,与子项目无关(这就是为什么所有子项目都在同一级别)。
正确,的确是后者有bug,现在修正成前者。
完美!谢谢。很高兴知道我没有老年痴呆(嗯... :))
0
参考:[https://clojure.atlassian.net/browse/TDEPS-132](https://clojure.atlassian.net/browse/TDEPS-132)(由severeoverfl0w报告)
...