【问题标题】:How to use local dependencies in Clojure?如何在 Clojure 中使用本地依赖项?
【发布时间】:2017-05-27 20:47:49
【问题描述】:

我正在开发一个库和一个使用该库的应用程序。

我没有这个库的任何远程存储库,它只是作为常规项目存储在 GitHub 上。

在我的应用程序中,我想将此库用作依赖项,我正在考虑使用这样的结构:

.
├── README.md
├── project.clj
├── repo
├── src
├── target
├── libraries
│   └── my-library
└── test

其中my-librarygit submodule 与我的图书馆。如何让我的应用知道这种依赖关系?

2016 年的解决方案是什么?

【问题讨论】:

  • 这看起来像是 stackoverflow.com/q/2404426 的副本。如果不是,请澄清。
  • 这不是 that 问题的重复,因为这个问题是关于源代码依赖关系的,而那个问题是关于 jar 文件的。这可能仍然是重复的,只是不是 那个 的重复
  • my-library 被包含为git submodule 有什么特别的原因吗?特别是,它与项目的关系是否不仅仅是另一个依赖项?

标签: maven clojure leiningen


【解决方案1】:

不需要将 lib 作为 git 子模块包含在内。 您可以在本地“发布” my-library 项目。

  1. 只需转到my-library 项目文件夹并运行lein pom; lein jar; lein install。这里的关键部分是lein install,它将jar和pom安装到本地存储库;通常是 ~/.m2。

  2. 转到使用此库的项目,只需在 project.clj 中将其声明为依赖项,就像 :dependencies [[my-library "version"]] 一样,它应该可以工作。

编辑: 同样,如果你使用Boot,你可以运行boot pom; boot jar; boot install

【讨论】:

    【解决方案2】:

    更简单的解决方案是使用lein checkouts,如下所述:https://github.com/technomancy/leiningen/blob/master/doc/TUTORIAL.md#checkout-dependencies

    在项目的顶层创建一个目录checkouts(与src 目录平行)。在checkouts 中,只需使用库代码创建指向项目目录的符号链接。例如,考虑一个项目clj 和一个库tupelo

    drwxrwxr-x 10 alan alan 4096 Jan  5 12:09 clj/
    drwxrwxr-x 11 alan alan 4096 Jan  9 20:01 tupelo/
    

    项目clj 如下所示:

    > d clj clj/* clj/checkouts/*
    
    drwxrwxr-x 10 alan alan  4096 Jan 12 10:36 clj/
    drwxrwxr-x  2 alan alan  4096 Oct 14 09:23 clj/checkouts/
    lrwxrwxrwx  1 alan alan    17 Oct 30 16:44 clj/checkouts/tupelo -> /home/alan/tupelo/
    drwxrwxr-x  2 alan alan  4096 Aug 31 10:05 clj/doc/
    -rw-rw-r--  1 alan alan 11219 Aug 31 10:05 clj/LICENSE
    -rw-rw-r--  1 alan alan   794 Jan  5 12:09 clj/project.clj
    -rw-rw-r--  1 alan alan   457 Aug 31 10:05 clj/README.md
    drwxrwxr-x  2 alan alan  4096 Jan  3 09:01 clj/resources/
    drwxrwxr-x  3 alan alan  4096 Aug 31 10:05 clj/src/
    drwxrwxr-x  8 alan alan  4096 Nov 14 16:26 clj/target/
    drwxrwxr-x  3 alan alan  4096 Sep 29 22:31 clj/test/
    

    现在,在构建 clj 项目时,它将(始终)使用来自 ~/tupelo 的源代码,而不是 clojars、maven 等。这意味着您不必制作 &(重新)安装 jar每次您进行要在 clj 中使用的更改时,都来自库 tupelo

    【讨论】:

    • 情况比你上一段暗示的要糟糕一些。 除了来自 maven 的代码之外,它将始终使用您的本地代码。如果您在本地结帐目录中使用一个版本的库,并且瞬态依赖项加载相同的库,则首先加载来自 maven 的库,然后在其之上加载您的库。因此,如果您曾经使用过结帐功能,请不要在顶层使用具有副作用的函数。
    • 还是这样吗?如何缓解?
    【解决方案3】:

    在 Clojure 中使用 git 子模块或基于本地文件的方法来管理库并不常见。 Clojure 将许多标准 Java 生态系统方法用于库管理。通常,这涉及构建库并将其部署到公共 Maven 存储库,例如 Clojars(或 Maven Central)。如果您只在自己的组织内使用它,还有其他选项用于组织级 Maven 存储库。

    然后,您可以在您自己的项目中使用该库,方法是在您选择的构建工具中将其声明为依赖项。在 Clojure 中,最常用的工具是 Leiningen,您可以将使用该库声明为 dependency

    其他替代方案是 Maven(与 Leiningen 非常相似,但采用 XML 格式)或 Boot,它们采用的方法略有不同。

    【讨论】:

    • 开销真的这么大吗?我不能只包含我自己的库吗?我是否必须为我的库剥离整个存储库?
    • 您不必这样做,而且我曾与很久没有这样做的团队合作过。最终他们都做到了,因为从长远来看,“正确地做”可以节省净寿命挫折暴露(和努力)
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2019-04-29
    • 2013-01-24
    相关资源
    最近更新 更多