就系统库而言,它并不是很干净。否则,您需要启动自己的 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项目开始,但它的配置相当复杂。所以,可能有一个更简单的例子。