cabal-bounds
============
A command line program for managing the bounds/versions of the dependencies in a cabal file.
`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](<http://www.haskell.org/haskellwiki/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
Installation
============
You have to ensure, that the `Cabal` library of `cabal-bounds` matches the one used by the `cabal` binary:
$> cabal --version
cabal-install version 1.18.0.2
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.
Issues
======
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