使用Opam管理项目依赖项

时间:2015-03-02 13:22:04

标签: dependencies ocaml opam

我是OCaml的全新手。我使用的其他语言(例如Scala,Clojure,Node.js上的Javascript)具有包管理器,允许一个人将项目作为一个包含已知版本的已声明依赖关系的干净平板启动。

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

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

并且有一个工作版本,没有在全球范围内安装任何东西。

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

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

1 个答案:

答案 0 :(得分:11)

对于系统库来说,它可能不是很干净。否则,您需要启动自己的VM或其他容器。但是对于OCaml环境,您可以在项目的根目录中使用opam文件来实现目标。在您描述了所有依赖项(包括系统1)之后,您可以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手动创建它。或者您可以允许pin命令为您创建它。它将引导您轻轻地完成整个过程,询问一些问题。您可以在此blog post中详细了解固定频率。

安装包和依赖项

在上一个命令中,我们添加了-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集成(实际上它是与OASIS集成的OPAM)。有一个oasis2opam包,可以从opam文件创建_oasis文件。如何创建描述项目构建过程的_oasis文件,然后您可以手动create使用您喜欢的文本emacs,或者您可以允许OASIS为您创建{{1} }}。

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