19

我是 OCaml 的新手。我使用过的其他语言(例如 Scala、Clojure、Node.js 上的 Javascript)具有包管理器,允许人们以干净的状态启动项目,并声明一组已知版本的依赖项。

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

git clone myproject
<magic opam command>
ocamlbuild

并拥有一个工作版本,而无需在全球范围内安装任何东西。

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

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

4

1 回答 1

13

就系统库而言,它并不是很干净。否则,您需要启动自己的 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 系统描述您的项目的文件,您可以使用此说明手动创建它。或者您可以允许pin命令为您创建它。它将引导您温和地完成整个过程,并提出一些问题。您可以在此博客文章中阅读有关固定的更多信息。

安装包和依赖项

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

$ opam depext --install proj

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

在项目上工作

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

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

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

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

编译和其他东西

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

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

于 2015-03-02T13:29:06.203 回答