Handling version ranges and pre-releases
When developing a package and using version ranges for defining our dependencies, there might come a time when a new version of a dependency gets a new pre-release version that we would like to test before it’s released to have a change to validate the new version ahead of time.
At first glance, it could be expected that the new version matches our range if it intersect it, but as described in the version ranges tutorial, by default Conan does not match pre-release versions to ranges that don’t specify it. Conan provides the global.conf core.version_ranges:resolve_prereleases
, which when set to True
, enables pre-release matching in version ranges. This avoids having to modify and export the recipes of your dependency graph, which would become unfeasible for large ones.
This conf has the added benefit of affecting the whole dependency graph, so that if any of our dependencies also define a requirement to our library of interest, the new version will also be picked up by it.
Let’s see this in action. Imagine we have the following (summarized) dependency graph, in which we depend on libpng
and libmysqlclient
, both of which depend on zlib
via the [>1.2 <2]
version range:
digraph G { node [fillcolor=”lightskyblue”, style=filled, shape=box] “app” -> “libpng/1.6.40” “app” -> “libmysqlclient/8.1.0” “libpng/1.6.40” -> “zlib/1.2.13” [label=”[>1.2 <2]“] “libmysqlclient/8.1.0” -> “zlib/1.2.13” [label=”[>1.2 <2]“] }
If zlib/1.3-pre
is now published, using it is as easy as modifying your global.conf file and adding the line core.version_ranges:resolve_prereleases=True
(or adding the --core-conf core.version_ranges:resolve_prereleases=True
CLI argument to your command invocations), after which, running conan create
will now output the expected prerelease version of zlib
being used:
...
======== Computing dependency graph ========
Graph root
cli
Requirements
libmysqlclient/8.1.0#493d36bd9641e15993479706dea3c341 - Cache
libpng/1.6.40#2ba025f1324ff820cf68c9e9c94b7772 - Cache
lz4/1.9.4#b572cad582ca4d39c0fccb5185fbb691 - Cache
openssl/3.1.2#f2eb8e67d3f5513e8a9b5e3b62d87ea1 - Cache
zlib/1.3-pre#f2eb8e6ve24ff825bca32bea494b77dd - Cache
zstd/1.5.5#54d99a44717a7ff82e9d37f9b6ff415c - Cache
Build requirements
cmake/3.27.1#de7930d308bf5edde100f2b1624841d9 - Cache
Resolved version ranges
cmake/[>=3.18 <4]: cmake/3.27.1
openssl/[>=1.1 <4]: openssl/3.1.2
zlib/[>1.2 <2]: zlib/1.3-pre
...
Now our package can be tested and validated against this new version, and the conf be afterwards removed once the testing is over to go back to the usual Conan behaviour.