新的 Opam 功能:“opam install <dir>”
在发布 opam build 功能之后,引发了很多讨论,主要围绕其界面和误导性的名称。但是,它提供的基本功能仍然被广泛需求
- 一种直接在当前目录中处理项目的方式,假设该目录包含一个或多个包的定义
- 一种将包的已安装文件复制到指定
destdir
下的方式 - 一种更简单的开始在项目上进行开发的方式,即使没有初始化的 opam
opam build
的状态
opam build
,如 之前的帖子 中所述,已被弃用。它将在下一个 Beta 版本中移除,以下内容将取代它。
处理本地项目
与处理本地切换一致,决定在有意义的情况下,重载命令的 <packages>
参数,允许使用目录名称,并表示“所有在该目录中定义的包”,并产生一些副作用。
例如,现在允许以下命令,我相信它会对很多人非常方便
opam install . --deps-only
此命令的作用是在当前目录(.
)中查找 opam
(或 <pkgname>.opam
)文件,解析其安装,并安装所有必需的包。这应该是手动运行源代码构建之前的唯一步骤。
以下内容稍微复杂一些
opam install .
这也会检索在 .
中定义的包,**将它们固定**到当前源代码(如果存在版本控制则使用版本控制),并安装它们。请注意,后续运行实际上会同步固定,以便源代码树中删除或重命名的包会被正确跟踪(例如,删除的包会被取消固定,新包会被固定,其他包根据需要升级)。
opam upgrade
、opam reinstall
和 opam remove
也已更新,以处理目录作为参数,并将作用于“固定到该目标的所有包”,即 由先前对 opam install <dir>
的调用固定的包。此外,opam remove <dir>
会取消固定这些包,从而一致地撤消相反的 install
操作。
opam show
已经有一个 --file
选项,但为了保持一致性和方便性,也以相同的方式进行了扩展。
当然,所有这些都与 ./
处的本地切换配合良好,但这两个功能可以完全独立地使用。另请注意,必须使用可能的包名称使目录名称变得唯一,因此请确保对子目录 foo
中的本地项目使用 ./foo
而不是仅使用 foo
。
指定 destdir
这依赖于已安装文件的跟踪,但实际上与其他 opam build
功能无关。现在它只是 opam install
的一个新选项
opam install foo --destdir ~/local/
将正常安装 foo
(如果尚未安装),并将所有已安装的文件(遵循相同的层次结构)复制到 ~/local
中。还支持 opam remove --destdir
来删除这些文件。
初始化
自动初始化目前已被弃用。它只节省了一个命令(opam init
,如果您忘记了它,opam 会很乐意为您打印出来),并且有两个缺点
- 跳过了某些重要细节(例如 opam 的 shell 设置)
- 初始化选项大大减少了,因此您通常仍然需要返回
opam init
。另一种可能性是将init
选项复制到所有命令中,从而增加了很多噪音。将事情分开有其优点。
当然,另一个命令 opam switch create .
已被隐式地使用。但是使用本地切换是用户的选择,更糟糕的是,与之前的实际 opam 默认值相矛盾,因此不自动创建它似乎更安全:为了获得更简单的行为而必须向 opam build
指定 --no-autoinit
既不方便又容易出错。
不过,提供了一项功能来帮助初始化:opam switch create <dir>
已改进为处理 <dir>
处的包定义,并将使用它们来选择兼容的编译器,就像 opam build
所做的那样。这避免了创建切换后发现该包与所选编译器版本不兼容,并且必须使用显式选择不同的编译器重新开始的挫折感。
如果您确实想要自动初始化,并且有更好的界面要提出,欢迎您提供反馈!
更多相关选项
已向 opam install
和相关命令添加了一些其他新选项,以改进项目本地工作流
opam install --keep-build-dir
现在由--reuse-build-dir
补充,用于 opam 中的增量构建(假设您的构建系统正确地支持它)。目前,您应该在相关包的每次升级时都指定这两个选项,或者您可以设置OPAMKEEPBUILDDIR
和OPAMREUSEBUILDDIR
环境变量。opam install --inplace-build
在源代码目录中直接运行脚本,而不是在专用副本中。如果多个包固定到同一个目录,则会禁用这些包的并行构建。opam install --working-dir
使用项目的当前工作目录状态,而不是版本控制系统中注册的状态。不用担心,如果您有未提交的更改并且忘记指定--working-dir
,opam 会警告您。
注意:本文已交叉发布到 opam.ocaml.org 和 ocamlpro.com。请访问后者查看评论!