Skip to main content

Opam

Last Updated: 11, August 2020 at 17:08:57

Managing Packages in OCaml

Opam is the the OCaml package manager and compiler manager. Packages could be executables to run from the command-line, compilers for other languages, libraries to use in your code etc. If you are arriving at OCaml from other languages, the opam-client (the tool you interact with from the command line) is roughly equivalent to:

  • Rust: rustup & cargo
  • Node (Javascript): nvm & npm (or yarn)
  • Python: pyenv & pip

In order to join the OCaml open source community, all you need to do is to add an opam file to your project. This opam file describes the build instructions for your project, as well as any dependencies it might need. An opam file is useful for a project of any size — from toy learning exercises to big theorem provers — since it allows someone else to easily rebuild and replicate your work, and even extend it if they choose to.

Opam files

Once you are comfortable with your code and want to share it more publicly, an opam file can be published to the central OCaml opam repository. This is a collection of tens of thousands of packages that have been contributed freely by the community since 2013. The opam-repository does not contain the full source code to your project; instead, it tracks pointers to different versions of your code, and also the various compatibility constraints to automatically figure out which versions work with each other. The usual mechanism to track your releases is to use a version control system such as git. You can browse the packages online to see what's available.

Opam Concepts

How do you actually manipulate opam files? There are several tools that can parse these files and repositories and install the software you want. The primary reference implementation that runs on macOS and Linux is also the opam client , and is the first thing you will want to configure on your system to get started. The following pages will guide you through a foundational understanding of how Opam works.

  1. Solving dependencies
  2. Switches and compilers
  3. Repositories and pinning
  4. Plugins
  5. The client and common commands