3.3 KiB
Managing Dependencies
The OCaml ecosystem has a wealth of third-party packages that are available for use. In this section we will look into how to use them with Dune.
Adding Dependencies
Much like in regular projects, to add a library we need to add a dependency to
it. For simplicity we will use the popular fmt library as an example, but any
package from the package repository can be used.
First we update the dune-project file to add a dependency on the opam package.
::::{dropdown} dune-project
:icon: file-code
:::{literalinclude} dependencies/dune-project :language: dune :emphasize-lines: 8 :::
::::
After this change to our project dependencies, we need to relock dependencies to update our lock directory with the new packages.
$ dune pkg lock
Solution for dune.lock:
- base-unix.base
- fmt.0.9.0
- ocaml.5.2.0
- ocaml-base-compiler.5.2.0
- ocaml-config.3
- ocamlbuild.0.15.0+dune
- ocamlfind.1.9.6+dune
- topkg.1.0.7
You can see a lot of new dependencies, among these fmt.
:::{note} The list of packages being output includes all dependencies of your project, including transitive dependencies. :::
This will take care of installing the dependencies, but we still need to add it to our build as a library as usual:
::::{dropdown} dune
:icon: file-code
:::{literalinclude} dependencies/dune :language: dune :emphasize-lines: 3 :::
Adding a library dependency to our dune file via the libraries stanza.
::::
This will allow us to use the Fmt module in our OCaml code.
::::{dropdown} test.ml
:icon: file-code
:::{literalinclude} dependencies/test.ml :language: ocaml :emphasize-lines: 4 :::
We update the code to define an Fmt.t pretty-printer for the list of strings
and then use it to print the value.
::::
To build it we just call build again.
$ dune build
which will download and install the new dependencies and build our project as before.
As we see, the code works and uses fmt to do the pretty-printing:
$ dune exec ./test.exe
Hello, OCaml, Rust!
Dependency Constraints
Packages are often only compatible with some versions of dependencies. To
specify a version range, use the regular Dune dependency syntax
used for opam dependencies in the dune-project file.
::::{dropdown} dune-project
:icon: file-code
:::{literalinclude} dependencies/constraints :language: dune :emphasize-lines: 7-8 :::
::::
This ensures the fmt package to install will be compatible with
our request. These constraints will be taken into account the next time the
package is locked:
$ dune pkg lock
Solution for dune.lock:
- base-unix.base
- fmt.0.9.0
- ocaml.5.2.0
- ocaml-base-compiler.5.2.0
- ocaml-config.3
- ocamlbuild.0.15.0+dune
- ocamlfind.1.9.6+dune
- topkg.1.0.7
The version of fmt picked is indeed between 0.6 and 1.0.
Removing Dependencies
Given all dependencies are defined in the dune-project file, removing a
dependency means to remove the dependency from the depends field of your
dune-project and relocking the project.
The new lock directory will not depend on the package anymore, and in future
builds, the package will not be accessible as library anymore.
:::{note} The removed dependency might still be part of the lock directory if some other dependency of your project depends on it. :::