就系统库而言,它不可能真正干净。否则,您需要启动自己的虚拟机或其他容器。但是对于 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
uses opam
向 OPAM 系统描述您的项目的文件,您可以使用此手动创建它指示 http://opam.ocaml.org/doc/Packaging.html。或者你可以允许pin
命令为您创建它。它将引导您温和地完成整个过程,并提出一些问题。您可以阅读有关固定的更多信息博客文章 https://opam.ocaml.org/blog/opam-1-2-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
文件,描述了项目的构建过程,那么您可以create http://oasis.forge.ocamlcore.org/MANUAL.html使用您最喜欢的文本 emacs 手动创建它,或者您可以允许 OASIS 为您创建它oasis quickstart
.
最后一点,我建议您查看现有项目并将其用作灵感来源。你可以从BAP https://github.com/BinaryAnalysisPlatform/bap.git我正在维护的项目,但它的配置相当复杂。所以,可能有更简单的例子。