使用 Opam 管理项目依赖关系

2024-03-18

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

我正在尝试与 Opam 做类似的事情。理想情况下,我想要一个列出依赖项(可能还有 OCaml 版本)的文件,以便协作者可以使用以下命令启动项目

git clone myproject
<magic opam command>
ocamlbuild

并且有一个工作版本,无需全局安装任何东西。

我知道执行此操作的正确方法是使用运算开关 https://opam.ocaml.org/doc/Usage.html#opam-switch,但我不确定在实践中该怎么做。似乎开关与编译器版本相关,而不是与每个项目相关(尽管有别名),而且我也找不到是否存在某种项目 Opam 配置文件。

简而言之:假设一个人想要根据 Core 和 Yojson 启动一个新项目(为了举例)。获得干净的可重复构建的步骤是什么?在这里,干净意味着它不会干扰现有已安装的库,可重现意味着它将在带有新克隆项目的干净机器上运行。


就系统库而言,它不可能真正干净。否则,您需要启动自己的虚拟机或其他容器。但是对于 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我正在维护的项目,但它的配置相当复杂。所以,可能有更简单的例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Opam 管理项目依赖关系 的相关文章

  • 使用 OCaml Graphics 实际更改文本大小

    我想知道如何在 OCaml 中设置文本大小 我试过Graphics set text size我想这应该可以达成交易 但无论我把set text size 200 or set text size 20并没有改变什么 Graphics se
  • 如何将 TLD 和 Tag Lib 文件添加到 Maven 的 jar 项目中

    我有一个 Maven 项目 打包为jar 我还有一个 Maven 项目 打包为war 这个 war 项目有一个 tld 文件和一些 xhtml 文件 标签库 战争项目的结构 基本上 是 pom xml src main java webap
  • 将库发布到 Maven 存储库

    我有一个稳定的开源库 http github com fernandezpablo85 scribe并想知道如何 以及是否 我可以将我的库发布到 Maven 官方存储库 以便人们可以将其包含在他们的pom xml文件并自动下载依赖项 将您的
  • 将 OCaml 转换为 F#:将 OCaml open_box 和 close_box 转换为 F#

    我正在将几个基于 OCaml 的模块转换为 F 并遇到了 OCaml 打印格式化函数open box 和 close box http caml inria fr pub docs manual ocaml libref Format ht
  • CMake 依赖于自定义目标中的“所有”目标

    我正在制作一个需要以一种奇特的方式打包的库 作为其中的一部分 我有一个包含以下几行的脚本 only install the lib component nd put in the a special directory ADD CUSTOM
  • CMake子目录依赖

    我对 CMake 很陌生 事实上 我正在通过 Kdevelop4 widh C 进行尝试 我习惯为我创建的每个命名空间创建子目录 即使所有源代码都必须编译并链接到单个可执行文件中 好吧 当我在 kdevelop 下创建一个目录时 它会使用
  • 使用 OCaml 警告属性禁用警告 8:不详尽的匹配

    我正在尝试编写类似于以下内容的代码 let a b body 1 2 我想仅针对该模式禁用警告 8 a b 而不是为了身体或让之外的任何东西 我尝试设置警告属性来禁用警告 但以下方法都不起作用 let warning 8 a warning
  • 静态初始化顺序惨败

    我在一本书中读到有关 SIOF 的内容 它给出了一个例子 file1 cpp extern int y int x y 1 file2 cpp extern int x int y x 1 现在我的问题是 在上面的代码中 会发生以下情况吗
  • 使用 OCaml 收集外部命令的输出

    在 OCaml 中调用外部命令并收集其输出的正确方法是什么 在Python中 我可以做这样的事情 os popen cmd read 如何在 OCaml 中获取外部程序的所有输出 或者 更好的是 带有 Lwt 的 OCaml Thanks
  • Node.js 管理频繁变化的本地依赖项

    我目前正在开发我的第一个较大的 Node js 应用程序 该应用程序应该使用类似插件的依赖项尽可能模块化地工作 因为我处于开发的早期阶段 而且对节点也很陌生 所以这涉及大量的试验和错误 因此我需要经常重新启动应用程序 因此启动时间应尽可能短
  • 在 Kali (Debian) 中安装 mono-devel 时,软件包具有未满足的依赖关系

    我尝试安装 mono devel 并输入sudo apt get mono devel在终端中 但失败了 得到以下结果 apt get install mono devel Reading package lists Done Buildi
  • 使用 MaltParser 和 NLTK 进行依存分析

    考虑一下这个句子 new sent PeterParker loves MaryJane 我尝试使用 malparser 和 NLTK 解析这句话 如下所示 maltParser nltk parse malt MaltParser wor
  • OCaml 中类型和模块相等的规则是什么

    我无法理解 OCaml 中模块的平等性 函子应该是适用的 这就是互联网所声称的 但这有时似乎会失败 而且我不太明白其背后的一般规则 这是我的示例代码 module type PT sig end module P struct end le
  • Visual Studio 项目的依赖关系图

    我目前正在将一个大型解决方案 约 70 个项目 从 VS 2005 NET 2 0 迁移到 VS 2008 NET 3 5 目前我有 VS 2008 NET 2 0 问题是我需要将项目一一移动到新的 NET 框架 确保没有 NET 2 0
  • 如何获取 C# 项目之间的依赖关系图

    我有一个相当复杂的应用程序 它已分解为多个组件 每个组件都有一个解决方案文件 其中包含一堆项目 所以我喜欢将其视为一个包含多个项目 dll 的组件 还有一个 通用 组件 所有其他组件都依赖于 common 所以编译是这样的 nant com
  • OCaml 3.12 中的一流模块:它们将使哪些事情变得更容易(或可能)?

    我听说 OCaml 3 12 中即将推出 一流模块 他们将提供什么优势 哪些孩子的事情会变得更容易 他们试图解决什么问题 一个简单的例子就足够了 这只是一个可能的应用程序 但一流的模块可以轻松地对存在类型进行编码 基本上是一个模块打包存在类
  • OCaml 2 和 3 之间的差异

    我有兴趣学习这门语言 但似乎有关该主题的教程和书籍很少 我只找到一本关于这个主题的合适的书 用 Objective Caml 这绝对是完美的 但问题是它是基于 2 04 版本的 所以我唯一关心的是使用这本书 对于 OCaml 3 x 是否会
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • OCaml 文字负数?

    我在学 这是我觉得奇怪的事情 let test treeways x match x with when x lt 0 gt 1 when x gt 0 gt 1 gt 0 如果我这样称呼它 test threeways 10 我会得到类型
  • 如何管理 OSGi 构建依赖项?

    我们已将 OSGi 运行时 Equinox 嵌入到自定义客户端 服务器应用程序中 以促进插件开发 到目前为止一切进展顺利 由于 Eclipse 内置的清单编辑器 依赖项管理和导出向导 我们一直使用 Eclipse 来构建插件 使用 Ecli

随机推荐

  • SQL:ENUM 与一对多关系的优点?

    我很少看到 ENUM 数据类型在野外使用 开发人员几乎总是只使用如下所示的辅助表 CREATE TABLE officer ranks id int PRIMARY KEY title varchar NOT NULL UNIQUE INS
  • PHPcurl:“列表中的未知密码”

    我正在使用以下密码列表curl setopt CURLOPT SSL CIPHER LIST DHE DSS AES256 GCM SHA384 DHE RSA AES256 GCM SHA384 DHE RSA AES256 SHA256
  • 如何包装一个方法,以便在超过指定超时时终止其执行?

    我有一个我想调用的方法 然而 我正在寻找一种干净 简单的方法来杀死它 或者在执行时间太长的情况下强制它返回 我正在使用Java 为了显示 logger info sequentially executing all batches for
  • 从 AWS Lambda 连接到 Redshift

    我正在尝试连接到我的Redshift来自我的数据库AWS Lambda功能 con psycopg2 connect dbname my dbname host my url port 5439 user username password
  • Nodejs crypto.publicEncrypt 在不同的机器上产生不同的结果

    我们正在尝试使用 AWS KMS 中的非对称密钥进行加密和解密 key的配置如下 在 NodeJS 中 我们通过 crypto publicEncrypt 使用公钥进行加密 const encryptRSAPayload buffer pu
  • 什么是mockito-inline以及它如何模拟最终方法?

    Mockito 中的 Javadocs 说 从版本 2 7 6 开始 我们提供了 mockito inline 工件 无需配置 MockMaker 扩展文件即可实现内联模拟制作 这是什么意思 mockito inline 是如何工作的 为什
  • 如何使用 JavaScript 读取文本区域中的文本?

    所以我是 JS 的新手 正在尝试了解基础知识 我决定制作一个基本的网页文本编辑器 现在我正在尝试用 JS 来区分单词 这是我的代码 基本上它确定单词 bob 是否已输入到文本区域中
  • 使用 php 验证链接

    谁能告诉我是否可以用 php 验证链接 通过验证 我的意思是检查链接是否处于活动状态 并且不仅仅是链接的实际格式 您需要执行 HEAD 请求并检查响应 200表示请求成功 还有其他的可以在这里找到 http www w3 org Proto
  • MacPorts 手动端口位置

    我正在从 MacPorts 安装一个 python 库 但macports版本的库比实际开发的svn版本旧 是否可以在 MacPorts 中指定端口安装的自定义位置 以便我可以从开发人员站点安装最新的库 Have http guide ma
  • MySQL 复合索引和运算符 BETWEEN

    我对这个查询有一个疑问 SELECT FROM runs WHERE NOW BETWEEN began at AND finished at 您认为为 begin at 和 finish at 列创建复合索引有意义吗 或者只为 begin
  • 模糊效果在模拟器中显示,但在 iPhone 上不显示

    我想创建一个模糊效果UIImageView与下面的代码 问题是 当我在模拟器中运行它时 我可以看到 BlurEffect 但当我连接 iPhone 时却看不到 这里我只能看到灰色背景 有什么想法吗 这是我使用的代码 import UIKit
  • 如何在 MASM 中编写远绝对 JMP/CALL 指令?

    如何使用 MASM 编写远绝对 JMP 或 CALL 指令 具体来说 如何让它使用 EA 和 CA 操作码发出这些指令 而不使用 DB 或其他数据指令手动发出它们 例如 考虑跳转到引导扇区中 FFFF 0000 处的 BIOS 重置入口点的
  • 使用 python 从 BytesIO 创建 Excel 文件

    我在用pandas用于存储 Excel 的库bytesIO记忆 稍后我会存储这个bytesIO对象导入 SQL Server 如下 df pandas DataFrame data1 columns col1 col2 col3 outpu
  • 非常慢的 HHVM、Wordpress、Nginx

    我可能做错了什么 但我正在 php fpm wordpress 设置和 HHVM wordpress 设置之间进行一些测试 我听过并看到过 HHVM 的许多令人兴奋的结果 但我只是对我得到的结果感到震惊 使用以下 apache 测试命令 我
  • 来自 Android 版 IndexedDB Chrome 中保存的块的 HTML5 视频

    我想使用 IndexedDB 在客户端存储离线 HTML5 应用程序的视频文件 为此 我从服务器 API 中下载了 2 个块的视频 然后我将它们作为 blob 存储在 indexedDB 中 然后在其他页面上我从数据库获取它们并创建新的 b
  • 迭代调用 pandas datareader

    我有一个带有股票列表的 python 字典 我试图在 for 循环中使用键 股票代码 见下文 来迭代地为所有股票 以股票代码命名 创建多个 pandas DataFrame 并通过 pandas DataReader 填充价格 交易量 我认
  • JavaFX和Mac:如何设置窗口关闭按钮修改状态?

    我希望能够设置应用程序的修改状态并将其反映在窗口关闭按钮 即其中的黑点 中 我发现了一个非常好的概述 参见 http nadeausoftware com node 90 http nadeausoftware com node 90 如何
  • 简单 mips 中的无限循环

    我正在尝试了解 ra 所以我想要的输出是 mainfunction1main 通过 main 调用 function1 function1 返回到 main 然后 main 完成 但由于某种原因 我得到一个无限循环 打印 mainfunct
  • 使用参数变量获取传递给 ES6 箭头函数的参数 [重复]

    这个问题在这里已经有答案了 我了解箭头函数在 ES6 中的工作原理以及词法 this 但我想知道是否有人知道如何将参数传递给箭头函数 在 ES5 中 你可以简单地执行以下操作 function foo bar baz console log
  • 使用 Opam 管理项目依赖关系

    我是 OCaml 的新手 我使用过的其他语言 例如 Scala Clojure Node js 上的 Javascript 都有包管理器 允许人们以干净的状态启动项目 该项目具有一组已声明的已知版本的依赖项 我正在尝试与 Opam 做类似的