opam 2.2.0
Feedback on this post is welcomed on Discuss!
We are very pleased to announce the release of opam 2.2.0, and encourage all users to upgrade. Please read on for installation and upgrade instructions.
Try it!
In case you plan a possible rollback, you may want to first backup your
~/.opam
or $env:LOCALAPPDATA\opam
directory.
The upgrade instructions are unchanged:
- Either from binaries: run
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.2.0"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) }"
or download manually from the Github "Releases" page to your PATH.
- Or from source, manually: see the instructions in the README.
You should then run:
opam init --reinit -ni
Changes
Major change: Windows support
After 8 years' effort, opam and opam-repository now have official native Windows support! A big thank you is due to Andreas Hauptmann (@fdopen), whose WODI and OCaml for Windows projects were for many years the principal downstream way to obtain OCaml on Windows, Jun Furuse (@camlspotter) whose initial experimentation with OPAM from Cygwin formed the basis of opam-repository-mingw, and, most recently, Jonah Beckford (@jonahbeckford) whose DkML distribution kept - and keeps - a full development experience for OCaml available on Windows.
OCaml when used on native Windows requires certain tools from the Unix world
which are provided by either Cygwin or MSYS2.
We have engineered opam init
so that it is possible for a user not to need to
worry about this, with opam
managing the Unix world, and the user being able
to use OCaml from either the Command Prompt or PowerShell. However, for the Unix
user coming over to Windows to test their software, it is also possible to have
your own Cygwin/MSYS2 installation and use native Windows opam from that. Please
see the previous blog post
for more information.
There are two "ports" of OCaml on native Windows, referred to by the name of provider of the C compiler. The mingw-w64 port is GCC-based. opam's external dependency (depext) system works for this port (including providing GCC itself), and many packages are already well-supported in opam-repository, thanks to the previous efforts in opam-repository-mingw. The MSVC port is Visual Studio-based. At present, there is less support in this ecosystem for external dependencies, though this is something we expect to work on both in opam-repository and in subsequent opam releases. In particular, it is necessary to install Visual Studio or Visual Studio BuildTools separately, but opam will then automatically find and use the C compiler from Visual Studio.
Major change: opam tree / opam why
opam tree
is a new command showing packages and their dependencies with a tree view.
It is very helpful to determine which packages bring which dependencies in your installed switch.
$ opam tree cppo
cppo.1.6.9
├── base-unix.base
├── dune.3.8.2 (>= 1.10)
│ ├── base-threads.base
│ ├── base-unix.base [*]
│ └── ocaml.4.14.1 (>= 4.08)
│ ├── ocaml-base-compiler.4.14.1 (>= 4.14.1~ & < 4.14.2~)
│ └── ocaml-config.2 (>= 2)
│ └── ocaml-base-compiler.4.14.1 (>= 4.12.0~) [*]
└── ocaml.4.14.1 (>= 4.02.3) [*]
Reverse-dependencies can also be displayed using the new opam why
command.
This is useful to examine how dependency versions get constrained.
$ opam why cmdliner
cmdliner.1.2.0
├── (>= 1.1.0) b0.0.0.5
│ └── (= 0.0.5) odig.0.0.9
├── (>= 1.1.0) ocp-browser.1.3.4
├── (>= 1.0.0) ocp-indent.1.8.1
│ └── (>= 1.4.2) ocp-index.1.3.4
│ └── (= version) ocp-browser.1.3.4 [*]
├── (>= 1.1.0) ocp-index.1.3.4 [*]
├── (>= 1.1.0) odig.0.0.9 [*]
├── (>= 1.0.0) odoc.2.2.0
│ └── (>= 2.0.0) odig.0.0.9 [*]
├── (>= 1.1.0) opam-client.2.2.0~alpha
│ ├── (= version) opam.2.2.0~alpha
│ └── (= version) opam-devel.2.2.0~alpha
├── (>= 1.1.0) opam-devel.2.2.0~alpha [*]
├── (>= 0.9.8) opam-installer.2.2.0~alpha
└── user-setup.0.7
Special thanks to @cannorin for contributing this feature.
Major change: with-dev-setup
There is now a way for a project maintainer to share their project development
tools: the with-dev-setup
dependency flag. It is used in the same way as
with-doc
and with-test
: by adding a {with-dev-setup}
filter after a
dependency. It will be ignored when installing normally, but it's pulled in when the
package is explicitly installed with the --with-dev-setup
flag specified on
the command line.
For example
opam-version: "2.0"
depends: [
"ocaml"
"ocp-indent" {with-dev-setup}
]
build: [make]
install: [make "install"]
post-messages:
[ "Thanks for installing the package"
"as well as its development setup. It will help with your future contributions" {with-dev-setup} ]
Major change: opam pin --recursive
When pinning a package using opam pin
, opam looks for opam files in the root directory only.
With recursive pinning, you can now instruct opam to look for .opam
files in
subdirectories as well, while maintaining the correct relationship between the .opam
files and the package root for versioning and build purposes.
Recursive pinning is enabled by the following options to opam pin
and opam install
:
- With
--recursive
, opam will look for.opam
files recursively in all subdirectories. - With
--subpath <path>
, opam will only look for.opam
files in the subdirectory<path>
.
The two options can be combined: for instance, if your opam packages are stored
as a deep hierarchy in the mylib
subdirectory of your project you can try
opam pin . --recursive --subpath mylib
.
These options are useful when dealing with a large monorepo-type repository with many opam libraries spread about.
New Options
-
opam switch -
, inspired bygit switch -
, makes opam switch back to the previously selected global switch. -
opam pin --current
fixes a package to its current state (disabling pending reinstallations or removals from the repository). The installed package will be pinned to its current installed state, i.e. the pinned opam file is the one installed. -
opam pin remove --all
removes all the pinned packages from a switch. -
opam exec --no-switch
removes the opam environment when running a command. It is useful when you want to launch a command without opam environment changes. -
opam clean --untracked
removes untracked files interactively remaining from previous packages removal. -
opam admin add-constraint <cst> --packages pkg1,pkg2,pkg3
applies the given constraint to a given set of packages -
opam list --base
has been renamed into--invariant
, reflecting the fact that since opam 2.1 the "base" packages of a switch are instead expressed using a switch invariant. -
opam install --formula <formula>
installs a formula instead of a list of packages. This can be useful if you would like to install one package or another one. For exampleopam install --formula '"extlib" |"extlib-compat"'
will install eitherextlib
orextlib-compat
depending on what's best for the current switch.
Miscellaneous changes
- The UI now displays a status when extracting an archive or reloading a repository
- Overhauled the implementation of
opam env
, fixing many corner cases for environment updates and making the reverting of package environment variables precise. As a result, usingsetenv
in an opam file no longer triggers a lint warning. - Fix parsing pre-opam 2.1.4 switch import files containing extra-files
- Add a new
sys-ocaml-system
default global eval variable - Hijack the
"%{var?string-if-true:string-if-false-or-undefined}%"
syntax to support extending the variables of packages with+
in their name (conf-c++
andconf-g++
already exist) using"%{?pgkname:var:}%"
- Fix issues when using fish as shell
- Sandbox: Mark the user temporary directory
(as returned by
getconf DARWIN_USER_TEMP_DIR
) as writable when TMPDIR is not defined on macOS - Add Warning 69: Warn for new syntax when package name in variable in string interpolation contains several '+' (this is related to the "hijack" item above)
- Add support for Wolfi OS, treating it like Alpine family as it also uses apk
- Sandbox:
/tmp
is now writable again, restoring POSIX compliance - Add a new
opam admin: new add-extrafiles
command to add/check/update theextra-files:
field according to the files present in thefiles/
directory - Add a new
opam lint -W @1..9
syntax to allow marking a set of warnings as errors - Fix bugs in the handling of the
OPAMCURL
,OPAMFETCH
andOPAMVERBOSE
environment variables - Fix bugs in the handling of the
--assume-built
argument - Software Heritage fallbacks is now supported, but is disabled-by-default for now. For more information you can read one of our previous blog post
And many other general and performance improvements were made and bugs were fixed. You can take a look to previous blog posts. API changes and a more detailed description of the changes are listed in:
- the release note for 2.2.0~alpha
- the release note for 2.2.0~alpha2
- the release note for 2.2.0~alpha3
- the release note for 2.2.0~beta1
- the release note for 2.2.0~beta2
- the release note for 2.2.0~beta3
- the release note for 2.2.0~rc1
- the release note for 2.2.0
This release also includes PRs improving the documentation and improving and extending the tests.
Please report any issues to the bug-tracker.
We hope you will enjoy the new features of opam 2.2! 📯