【发布时间】:2014-05-21 16:30:29
【问题描述】:
我想知道与其他程序员(以及与自己在多个项目之间)共享 Prolog 代码/库的最佳实践是什么。我自己也在使用 SWI-Prolog,但也对其他 Prolog 如何解决这个问题感兴趣。
相比之下,Java 有 Maven+JAR,Python 有 EasyInstall+PythonEggs,其他语言可能还有很多其他语言。但是 Prolog 有吗?
SWI-Prolog 包
在 SWI-Prolog 中有包,由模块 library(prolog_pack) 支持。这些的缺点是:
- 您必须为每个包创建存档文件或 Git 存储库。假设我想创建 10 个包。现在我需要创建 10 个 Git 存储库。我有时会进行影响多个文件的编辑,这些文件可能驻留在多个包/存储库中,需要我提交多个 Git 存储库以进行单个(多文件)编辑。
- 为了创建一个包,您必须手动挑选一些“属于一起”的文件。有时我发现文件 X 既属于包 A 又属于包 B。现在我需要在存储库 A 和 B 中维护文件 X 的副本,或者我需要创建另一个只包含 X 的包 C 并将 C 导入A 和 B。
- 包在公共网站上发布。我的大部分图书馆只对我感兴趣。其中有一些对我合作过的特定人员很感兴趣,只有少数“准备好”进行更广泛/公开的传播。
- 包维护者必须指定包间的依赖关系。对于复杂的库层次结构,这对我来说似乎是不必要的工作。我已经非常严格地使用 Prolog 模块,并且想简单地使用 Prolog 模块导入的层次结构作为依赖图。
Git 子模块
到目前为止,我一直使用的另一种方法是 Git 子模块。库之间的依赖关系是通过将一个存储库导入另一个存储库来实现的。这与 SWI-Prolog 包有一些相同的缺点:
- 每个库都有一个 Git 存储库,因此需要维护大量存储库。
- 维护者必须明智地选择每个 repo 的文件,并且必须指定需要包含哪些 Git 子模块。
- 更新现有库非常困难。我发现(艰难的方式)我交给我的代码的大多数人都无法成功地更新具有许多错综复杂的相互依赖的子模块导入的 Git 存储库。 (我非常尊重偶尔使用子模块并且总是做对的 Git 大师,但是大多数非程序员和与我一起工作的很多程序员都觉得这太难了。)
我的理想方法
我个人对完美 Prolog 代码共享方法的偏好是:
- 您传播的库的数量和您拥有的 Git 存储库的数量是独立的。具体来说,我可以拥有一个相当大的存储库,其中的一部分以不同的方式传播。如果有人喜欢(重新)将我的 Prolog 模块与 DCG 辅助谓词一起使用,那么我可以简单地将单个文件(以及潜在的依赖项)传播给那个人。
- 您不必手动选择和手动复制单个文件,而是让算法遍历模块导入的层次结构以提取那些(显然)属于一起的文件。第一次运行程序时会下载这些文件。这些文件可能都属于同一个 Git 存储库或多个,算法根本不应该关心存储库和库之间或存储库和文件之间的映射。
- 代码的维护者能够决定一个库是公开发布还是发布给有限的一群人(或只包括维护者的有限群体)。
- 文件之间的模块导入层次结构是依赖跟踪所需要的。
以上暗示我理想的库共享方法是基于文件而不是基于包的。如果 Prolog 模块 A 使用 Prolog 模块 B 并且加载了 A,则 B 要么从本地文件(如果存在)加载,要么从存储库下载。我不确定基于文件的方法在其他语言中有多普遍。前面提到的 Maven+JAR 和 EasyInstall+PythonEggs 都是基于包的。
我对其他 Prolog 程序员对此主题的使用和思考非常感兴趣!
【问题讨论】:
标签: module prolog git-submodules swi-prolog package-managers