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](), 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