当其他库在 clojure 中使用不同版本时,指定要使用的库版本

Specify version of library to use when other libraries use different versions in clojure

现在我正在开发一个 clojure 项目,该项目包含内部编写的其他代码。通过所有这些代码,我们的一个库已经实施了好几次,我知道在我的 project.clj 文件中我可以指定不使用类似

的东西来拉入那个库
:dependencies[
    [my-library "2.1.1" :exclusions [old-lib]]
    [their-library "2.1.3" :exclusions [old-lib]]
    [new-library "0.0.1"]
]

有没有办法让我指定在新库中使用旧库的版本,而不是指定所有不使用它的地方?所以与其说到处都排除,不如指定使用旧库的新库版本。像...

:dependencies[
    [my-library "2.1.1"]
    [their-library "2.1.3"]
    [new-library "0.0.1" :use-this-lib [old-lib]]
]

Leiningen 有一个全局 :exclusions 键,您可以使用它从所有依赖项中排除并自己提供依赖项。

https://github.com/technomancy/leiningen/blob/ee57b19a5daae0687f22c7aba0da55538366664f/sample.project.clj#L63-L66

:dependencies[
  [my-library "2.1.1"]
  [their-library "2.1.3"]
  [new-lib "0.0.1"]
]
:exclusions [old-lib]

另一种选择是使用 :managed-dependecies。它会让您为 leiningen 在多个地方遇到的依赖项指定一个“回退”版本。将此类依赖项移动到 :managed-dependencies 块,然后在没有版本的 :dependencies 块中再次指定它们。

:managed-dependencies [
  [old-lib "DESIRED-VERSION"]]

:dependencies[
  [old-lib]
  [my-library "2.1.1"]
  [their-library "2.1.3"]
  [new-library "0.0.1"]]

此页面很好地解释了这个概念。 https://cljdoc.org/d/leiningen/leiningen/2.9.5/doc/managed-dependencies-with-leiningen