Dependencies 使用Opam管理项目依赖关系

Dependencies 使用Opam管理项目依赖关系,dependencies,ocaml,opam,Dependencies,Ocaml,Opam,我是OCaml的新手。我使用过的其他语言(例如Scala、Clojure、Node.js上的Javascript)都有包管理器,允许一个人以一张干净的石板启动一个项目,该石板上有一组已知版本的依赖项 我正试图用Opam做类似的事情。理想情况下,我希望有一个列出依赖项(可能还有OCaml版本)的文件,这样协作者就可以开始一个项目 git clone myproject <magic opam command> ocamlbuild git克隆myproject 奥卡姆建筑 并且有一

我是OCaml的新手。我使用过的其他语言(例如Scala、Clojure、Node.js上的Javascript)都有包管理器,允许一个人以一张干净的石板启动一个项目,该石板上有一组已知版本的依赖项

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

git clone myproject
<magic opam command>
ocamlbuild
git克隆myproject
奥卡姆建筑
并且有一个工作版本,没有在全球范围内安装任何东西

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


简言之:假设您希望根据Core和Yojson启动一个新项目(为了示例)。有一个干净的可复制构建的步骤是什么?在这里,“干净”意味着它不会干扰现有已安装的库,而“可复制”意味着它将在新克隆项目的干净机器上工作。

就系统库而言,它不可能真正干净。否则,您需要启动自己的VM或其他容器。但是对于OCaml环境,您可以使用项目根目录中的
opam
文件来实现您的目标。在描述了所有依赖项(包括system one)之后,您可以
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
现在,让我们以一步一步的方式浏览此工作流

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

锁定项目 此命令将向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
,或者拥有一组调用
ocamlbuild
的shell脚本,这完全取决于您自己。但如果我在你身边,我会用OASIS来管理我的建筑过程。OASIS本身不是一个构建系统,其目的是以跨平台的方式管理构建系统。但默认情况下,它使用
ocamlbuild
,并与之平滑集成。此外,它还与OPAM集成(事实上,是OPAM与OASIS集成)。有一个
oasis2opam
包,它将从
\u oasis
文件创建一个
opam
文件。如何创建描述项目构建过程的
\u oasis
文件,然后您可以使用自己喜欢的文本emacs手动创建该文件,也可以使用
oasis quickstart
允许oasis为您创建该文件


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

对不起,我想我需要更多的帮助。您提到的
opam
文件是什么?在
opam开关中安装xxx-A 4.02.1
什么是
xxx
?项目名称?我想安装的库的名称?另外,我认为
ocamlbuild
是我构建OCaml项目所需要的,但是有没有办法使它与Opam协同工作?是的,有。给我几分钟来扩展答案谢谢,回答得很好!:-)经过几天的努力,我还是很困惑。看到我的另一个问题,我想我的困难来自你的一句话“创建_oasis文件怎么样,它描述了你项目的构建过程”。实际上,我不想描述我的项目的构建过程,除非我正在做一些特别先进的事情。我理想的构建过程应该始终是一样的:下载依赖项,编译文件并将它们链接在一起。
$ opam depext --install proj
 $ edit proj/src/main.ml # do the development
 $ opam upgrade proj