使用 Opam 管理项目依赖

Using Opam to manage project dependencies

我是 OCaml 的新手。我使用过的其他语言(例如 Scala、Clojure、Javascript on Node.js)具有包管理器,允许人们以一个干净的平台开始一个项目,该项目具有一组已声明的已知版本的依赖项。

我正在尝试用 Opam 做一些类似的事情。理想情况下,我希望有一个列出依赖项(可能还有 OCaml 版本)的文件,以便协作者可以使用

启动项目
git clone myproject
<magic opam command>
ocamlbuild

并且有一个工作版本,没有全局安装任何东西。

我知道正确的方法是使用 Opam switches,但我不确定在实践中该怎么做。开关似乎与编译器版本相关,而不是与每个项目相关(尽管有别名),而且我也找不到是否存在某种项目 Opam 配置文件。

简而言之:假设有人想根据 Core 和 Yojson 开始一个新项目(为了举例)。拥有干净的可重现构建的步骤是什么?在这里,clean 意味着它不会干扰现有已安装的库,reproducible 意味着它可以在干净的机器上使用新克隆的项目。

关于系统库,它不能真正干净。否则,您需要启动自己的 VM 或其他容器。但是对于 OCaml 环境,您可以使用项目根目录中的 opam 文件来实现您的目标。在其中描述了所有依赖项(包括系统一)后,您可以 pin 您的项目,这将安装所有依赖项,编译您的项目并将其部署到 opam 堆栈。所以工作流程如下:

 $ # install opam 1.2
 $ # install aspcud (optionally, but highly recommended)
 $ opam switch install fresh -A 4.02.1
 $ opam pin add proj /path/to/proj -n
 $ opam depext --install proj
 # optional part:
 $ edit proj/src/main.ml # do the development
 $ opam upgrade proj

现在让我们逐步了解这个工作流程。

安装编译器

 $ opam switch install fresh -A 4.02.1 

此命令创建一个新的编译器安装。这里 fresh 没有特殊含义,它只是安装的任意名称。通常,我使用 date +"%y%m%d" 命令而不是 fresh 创建一个由当前年、月和日组成的名称。

固定项目

$ opam pin add proj /path/to/proj -n

此命令会将您的项目引入 OPAM 系统。这就像创建您自己的小型软件包存储库,只包含一个软件包,proj。名称 proj 当然只是您项目的名称,无论它是什么。 pin 使用 opam 文件向 OPAM 系统描述您的项目,您可以使用此 instructions. Or you can allow pin command to create it for you. It will drive you gently through the process, asking some questions. You can read more about pinning in this blog post 手动创建它。

正在安装包和依赖项

在前面的命令中,我们添加了 -n 标志,这将阻止 pin 命令在固定后立即安装您的包,因为我们想要小步移动。

$ opam depext --install proj

此命令将计算你的包依赖项的传递闭包并安装它们,包括你的系统依赖项(如果你在 ubuntu 或 fedora 上,并且如果你在 [=15] 中指定了你的依赖项=] 上一步中的文件)。

正在处理项目

假设您要开发代码。有一个 OPAM 友好的工作流程:

 $ edit proj/src/main.ml # do the development
 $ opam upgrade proj

这将重新安装您的软件包(并重新安装您的软件包的所有依赖项,如果它们存在的话)。

另一方面,如果您的项目不是很小,此工作流程有一个严重的缺点,因为它会复制所有源代码并从头开始编译它们。但是,如果您有一组并行工作的依赖包,那么这是一种方法。

编译和其他东西

但这只是关于包管理和包间依赖关系。 OPAM 对特定的构建系统绝对不可知,并且不会对它们中的任何一个给予任何帮助(但仍然有对其中一些的工具支持)。因此,您可以自己编写 Makefile 或拥有自己的一套 shell 脚本来调用 ocamlbuild 这完全取决于您。但如果我在你身边,那么我会使用 OASIS 来管理我的构建过程。 OASIS 本身并不是一个构建系统,它的目的是以跨平台的方式管理构建系统。但默认情况下它使用 ocamlbuild 并且可以顺利集成。此外,它还与 OPAM 进行了集成(实际上是 OPAM 与 OASIS 进行了集成)。有一个 oasis2opam 包,它将从 _oasis 文件创建一个 opam 文件。创建描述项目构建过程的 _oasis 文件怎么样,然后您可以 create 使用您最喜欢的文本 emacs 手动创建它,或者您可以让 OASIS 使用 [=35] 为您创建它=].

最后一点,我建议您查看现有项目并将其作为灵感来源。您可以从我正在维护的 BAP 项目开始,但它的配置相当复杂。所以,可能有一个更简单的例子。