cab

A maintenance command of Haskell cabal packages

Kazu Yamamoto

"cab" is a MacPorts-like maintenance command of Haskell cabal packages. Some parts of this program are a wrapper to "ghc-pkg" and "cabal" version 0.18 or later.

If you are always confused due to inconsistency of "ghc-pkg" and "cabal", or if you want a way to check all outdated packages, or if you want a way to remove outdated packages recursively, this command helps you.

"cab" is designed to maintain user packages only assuming that users use a Haskell Platform and don't want to touch the global packages.

"cab" is tested on both Mac and Windows and with GHC 7.6.3 or later.

Usage

The following commands are provided:

cab
Display the help message.
cab sync
Fetch the latest package index.
Command aliases: update
cab install [-n] [-f <flags>] [-t] [-d] [-p] [-e] [-j <jobs>] [-s] [<package> [<ver>]]
Install packages.
cab uninstall [-n] [-r] <package> [<ver>]
Uninstall packages.
Command aliases: delete, remove, unregister
cab installed [-a] [-r] [-m]
List installed packages.
Command aliases: list
cab configure [-f <flags>] [-t] [-b] [-p] [-e] [-s]
Configure a cabal package.
Command aliases: conf
cab build [-j <jobs>]
Build a cabal package.
cab clean
Clean up a build directory.
cab outdated [-a]
Display outdated packages.
cab info <package> [<ver>]
Display information of a package.
cab sdist
Make tar.gz for source distribution.
Command aliases: pack
cab upload [-n]
Uploading tar.gz to HackageDB.
Command aliases: up
cab unpack <package> [<ver>]
Untar a package in the current directory.
cab deps [-r] [-a] [-m] <package> [<ver>]
Show dependencies of this package.
cab revdeps [-r] [-a] [-m] <package> [<ver>]
Show reverse dependencies of this package.
Command aliases: dependents
cab check
Check consistency of packages.
cab genpaths
Generate Paths_<pkg>.hs.
Command aliases: genpath
cab search <key>
Search available packages by package name.
cab add <source>
Add a source directory.
Command aliases: add-source
cab test [testsuite]
Run tests.
cab bench
Run benchmarks.
cab doc
Generate manuals.
Command aliases: haddock, man
cab ghci [-i <dir>:<dir>]
Run GHCi (with a sandbox).
Command aliases: repl
cab init
Initialize a sandbox.
cab help [<command>]
Display the help message of the command.

The following options are provided:

--dry-run, -n
Run without destructive operations
--recursive, -r
Follow dependencies recursively
--all, -a
Show global packages in addition to user packages
--info, -m
Show license and author information
--flags, -f
Specify flags
--test, -t
Enable test
--bench, -b
Enable benchmark
--dep-only, -d
Target only dependencies
--lib-prof, -p
Enable library profiling
--exec-prof, -e
Enable library profiling
--jobs, -j
Run N jobs
--import, -i
Add module import paths
--static, -s
Create static libraries only

Catching up HackageDB

% cab sync
% cab outdated
foo 0.0.1 < 0.0.2
% cab delete -r foo
Deleting foo 0.0.1
Deleting bar 2.0.5
% cab install bar

Installing a new package

Before installing, check whether or not a new package break user packages:

% cab -n install foo
Reading available packages...
Resolving dependencies...
In order, the following would be installed:
bar-1.0.9 (reinstall)

If you see "reinstall", please stop installing. You should consider to use a sandbox.

Developing

A sandbox is very useful to develop your package which requires new non-registered packages.

% cd <your_package>
% cab init
% cab install -d -t -j 3
% cab conf
% cab build

Understanding dependency

Dependency of a package:

% cab -r deps wai-app-file-cgi
attoparsec 0.8.5.0
blaze-builder 0.2.1.4
enumerator 0.4.9.1
network 2.2.1.10
wai 0.3.2
    blaze-builder 0.2.1.4
    enumerator 0.4.9.1
    network 2.2.1.10
wai-app-static 0.0.1.4
    blaze-html 0.4.1.0
        blaze-builder 0.2.1.4
    file-embed 0.0.3.1
    unix-compat 0.2.1.1
    wai 0.3.2
        blaze-builder 0.2.1.4
        enumerator 0.4.9.1
        network 2.2.1.10
    web-routes 0.23.4
        network 2.2.1.10
        utf8-string 0.3.6

Reverse dependency of a package:

% cab revdeps blaze-builder
blaze-builder-enumerator 0.2.0.2
blaze-html 0.4.1.0
cookie 0.0.0
hamlet 0.7.3
http-enumerator 0.3.1
json-enumerator 0.0.1.1
mime-mail 0.1.0.1
wai 0.3.2
wai-app-file-cgi 0.0.2
wai-extra 0.3.3
warp 0.3.3
yesod-core 0.7.0.2
yesod-form 0.0.0.2

Install

Type as follows:

% cabal install cab

You should add "~/.cabal/bin" to the PATH environment variable.

Repository

The latest source code is available from github:

Acknowledgment

I thank shelarcy for his testing.