如何在Clojure中使用本地依赖?

8
我正在开发一个使用IT技术的库和应用程序。 我没有任何远程存储库来存储这个库,它只是作为一个常规项目存储在GitHub上。 在我的应用程序中,我想将这个库作为一个依赖项使用,我考虑的结构如下:
.
├── README.md
├── project.clj
├── repo
├── src
├── target
├── libraries
│   └── my-library
└── test

在其中,my-library 是我的库的 git submodule。如何让我的应用程序知道这个依赖关系?

2016年的解决方案是什么?


这看起来像是 https://dev59.com/WXE95IYBdhLWcg3wOLQ1 的重复。如果不是,请澄清一下。 - glts
可能是leiningen - how to add dependencies for local jars?的重复问题。 - Jeen Broekstra
3
这不是那个问题的复制,因为这个问题涉及源代码依赖关系,而那个问题专门涉及一个JAR文件。这可能仍然是一个重复的问题,但它不是那个问题的重复。 - Arthur Ulfeldt
有没有特别的原因将 my-library 作为 git submodule 包含进来?特别是,它与项目的关系是否不仅仅是另一个依赖项? - Nathan Davis
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
12

不必将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


5
一种更简单的解决方案是使用 lein checkouts,如此文档所述:https://github.com/technomancy/leiningen/blob/master/doc/TUTORIAL.md#checkout-dependencies 在项目的顶层目录(与src目录平行)创建一个名为checkouts的文件夹。在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等。这意味着您不必每次想要在clj中使用更改时都制作和(重新)安装lib tupelo中的jar。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Arthur Ulfeldt
1
这是否仍然是事实,如何加以缓解? - Chris Schreiner

2
在Clojure中,通常不使用git子模块或本地文件方式来管理库。Clojure利用了标准的Java生态系统库管理方法。一般情况下,这涉及构建并将库部署到公共Maven存储库,如Clojars(或Maven Central)。如果您只在自己的组织内使用,则还有其他选项可供组织级别的Maven存储库。 然后,您可以通过在所选构建工具中声明其作为依赖项来在自己的项目中使用该库。在Clojure中,最常见的工具是Leiningen,您可以将该库声明为依赖项。 其他选择包括Maven(与Leiningen非常相似,但格式为XML)或Boot,它采取了稍微不同的方法。

这真的是如此巨大的开销吗?我不能只包含自己的库吗?我必须为我的库分离整个存储库吗? - Kamil Lelonek
1
你不必这样做,我曾经与很多团队一起工作,他们长时间内都没有这样做。最终,他们都开始这样做了,因为从长远来看,“正确地做事”可以节省净生命周期挫败感和风险(以及努力)。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,