使用Opam管理项目依赖项

And*_*rea 15 dependencies ocaml opam

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

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

git clone myproject
<magic opam command>
ocamlbuild
Run Code Online (Sandbox Code Playgroud)

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

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

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

ivg*_*ivg 11

它对系统库来说不是很干净.否则,您需要启动自己的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
Run Code Online (Sandbox Code Playgroud)

现在让我们一步一步地介绍这个工作流程.

安装编译器

 $ opam switch install fresh -A 4.02.1 
Run Code Online (Sandbox Code Playgroud)

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

固定项目

$ opam pin add proj /path/to/proj -n
Run Code Online (Sandbox Code Playgroud)

此命令将您的项目介绍给OPAM系统.这就像创建自己的小包存储库,只包含一个包,proj.这个名字proj当然只是你项目的名称,无论它是什么.pin使用opam描述项目的文件到OPAM系统,您可以使用此说明手动创建它.或者您可以允许pin命令为您创建它.它将引导您轻轻地完成整个过程,询问一些问题.您可以在此博客文章中阅读有关固定的更多信息.

安装包和依赖项

在上一个命令中,我们添加了-nflag,这将阻止pin命令在固定之后安装你的包,因为我们想要小步移动.

$ opam depext --install proj
Run Code Online (Sandbox Code Playgroud)

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

致力于该项目

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

 $ edit proj/src/main.ml # do the development
 $ opam upgrade proj
Run Code Online (Sandbox Code Playgroud)

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

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

编译和其他东西

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

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