The cabal-bounds package
cabal-bounds is able to do two things:
- drop the bounds of the dependencies in the cabal file - update the bounds of the dependencies in the cabal file using the cabal build information
Example: Raise the upper Bounds
If you have several cabalized projects, then it can be quite time consuming to keep the bounds of your dependencies up to date. Especially if you're following the package versioning policy, then you want to raise your upper bounds from time to time, to allow the building with newer versions of the dependencies.
cabal-bounds tries to automate this update process to some degree. So a typical update process might look like:
$> # update the version infos of all libraries $> cabal update $> # drops the upper bound of all dependencies in 'myproject.cabal', most likely you want to ignore 'base' $> cabal-bounds drop --upper --ignore=base myproject.cabal $> # create a cabal sandbox for building of 'myproject' $> cabal sandbox init $> # build 'myproject' $> cabal install $> # update the upper bound of all dependencies in 'myproject.cabal' by the cabal build information $> cabal-bounds update --upper --ignore=base myproject.cabal dist/dist-sandbox-*/setup-config
Example: Bound Changes
The => shows what the result is of the operation for every dependency. Left is the dependency before calling the command, right the one after calling.
$> cabal drop myproject.cabal lens >=4.0.1 && <4.1 => lens $> cabal drop --upper myproject.cabal lens >=4.0.1 && <4.1 => lens >=4.0.1
If the cabal build (the setup-config) uses 'lens 4.1.2', then the results of the update command would be:
$> cabal update myproject.cabal setup-config lens >=4.0.1 && <4.1 => lens >=4.1.2 && <4.2 lens => lens >=4.1.2 && <4.2 $> cabal update --lower myproject.cabal setup-config lens >=4.0.1 && <4.1 => lens >=4.1.2 lens <4.1 => lens >=4.1.2 lens => lens >=4.1.2 $> cabal update --upper myproject.cabal setup-config lens >=4.0.1 && <4.1 => lens >=4.0.1 && <4.2 lens >=4.0.1 => lens >=4.0.1 && <4.2 lens => lens >=4.1.2 && <4.2
You have to ensure, that the Cabal library of cabal-bounds matches the one used by the cabal binary:
$> cabal --version cabal-install version 18.104.22.168 using version 1.18.1 of the Cabal library $> cabal install --constraint="Cabal == 1.18.1" cabal-bounds
If you update the cabal binary and the used Cabal library changes, then you have to rebuild cabal-bounds.
Command Line Usage
$> cabal-bounds --help cabal-bounds [COMMAND] ... [OPTIONS] A command line program for managing the bounds/versions of the dependencies in a cabal file. Common flags: -O --only=ITEM Only the bounds of the dependency are modified. -I --ignore=ITEM This dependency is ignored, not modified in any way. -o --outputCabalFile=ITEM Save modified cabal file to file, if empty, the cabal file is modified inplace. -h --help Display help message -v --version Print version information cabal-bounds drop [OPTIONS] CABAL-FILE -U --upper Only the upper bound is dropped, otherwise both - the lower and upper - bounds are dropped. -l --library Only the bounds of the library are dropped. -e --executable=ITEM Only the bounds of the executable are dropped. -t --testsuite=ITEM Only the bounds of the test suite are dropped. -b --benchmark=ITEM Only the bounds of the benchmark are dropped. cabal-bounds update [OPTIONS] CABAL-FILE SETUP-CONFIG-FILE -L --lower Only the lower bound is updated. -U --upper Only the upper bound is updated. -l --library Only the bounds of the library are updated. -e --executable=ITEM Only the bounds of the executable are updated. -t --testsuite=ITEM Only the bounds of the test suite are updated. -b --benchmark=ITEM Only the bounds of the benchmark are updated.
Perhaps the currently most annoying thing is, that you have to live with the reformating of your cabal file done by the pretty printer of the Cabal library.
To reformat your cabal file without changing any bounds you can call cabal-bounds with the name of a section that isn't present in the cabal file:
$> cabal-bounds drop --executable=blub myproject.cabal
[Skip to Readme]
|Versions||0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8, 0.1.9, 0.1.10, 0.1.11, 0.1.12, 0.1.13, 0.1.14, 0.1.15, 0.1.16, 0.2, 0.2.1, 0.3, 0.4, 0.4.1, 0.5, 0.6, 0.7, 0.8, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5, 0.8.6, 0.8.7, 0.8.8, 0.8.9, 0.9, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.1.0 (info)|
|Dependencies||base (>=3 && <5), Cabal (>=1.18.0 && <1.19), cmdargs (>=0.10.5 && <0.11), lens (>=4.0.1 && <4.1), strict (>=0.3.2 && <0.4) [details]|
|Source repository||head: git clone https://github.com/dan-t/cabal-bounds|
|Uploaded||Mon Feb 24 20:15:53 UTC 2014 by DanielTrstenjak|
|Downloads||7851 total (130 in the last 30 days)|
|Status||Docs available [build log]
Successful builds reported [all 1 reports]
For package maintainers and hackage trustees