@hackage sandman0.2.0.1

Manages Cabal sandboxes to avoid rebuilding packages.

sandman helps manage Cabal sandboxes so that you can avoid rebuilding packages that you use often.

It does so by managing a global collection of sandboxes that were built separately. You can mix any number of these sandboxes into the package database for your project-specific sandbox.

Usage: sandman COMMAND

Available options:
  -h,--help                Show this help text

Available commands:
  list                     List sandman sandboxes or the packages in them
  new                      Create a new sandman sandbox
  destroy                  Delete a sandman sandbox
  install                  Install a new package
  mix                      Mix a sandman sandbox into the current project
  clean                    Remove all mixed sandboxes from the current project

Example usage

First, we create a sandbox that will contain packages we commonly use for development.

$ sandman list
lens (25 packages)

$ sandman new common
[..]
Created sandbox common.

Managed sandboxes can be told to use specific versions of GHC. This information will be propagated to projects with which this sandbox is mixed.

$ sandman new common --with-ghc ghc-7.6.3

We install our commonly used packages

$ sandman install common classy-prelude 
[..]
Configuring classy-prelude-0.10.2...
Building classy-prelude-0.10.2...
Installed classy-prelude-0.10.2

$ sandman list
lens (25 packages)
common (45 packages)

$ sandman list common
[..]
classy-prelude-0.10.2
[..]

$ sandman destroy lens
Removed sandbox lens.

$ sandman list
common (45 packages)

$ sandman install common optparse-applicative aeson

Next, we mix it into an existing project.

$ cd my_project
$ cabal sandbox init
$ cabal sandbox hc-pkg list | grep classy-prelude
<nothing>

$ sandman mix common
Mixing 45 new packages into package DB at [..]
Rebuilding package cache.

$ cabal sandbox hc-pkg list | grep classy-prelude
  classy-prelude-0.10.2

$ cabal repl
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
λ> import ClassyPrelude
λ> 

$ sandman clean
Removing all mixed sandboxes.
Removed 45 packages.
Rebuilding package cache.

sandman can also mix in only specific packages and their dependencies from managed sandboxes.

$ sandman mix common --only system-filepath --only system-fileio
Mixing 3 new packages into package DB at [..]
Rebuilding package cache.

$ cabal sandbox hc-pkg list
[..]
  system-fileio-0.3.16
  system-filepath-0.4.13.1
  text-1.2.0.4

The --executables option may be used to include executables from a sandbox.

$ sandman mix common --executables --only hspec
Mixing 15 new packages into package DB at [..]
Rebuilding package cache.

$ ls .cabal-sandbox/bin
hspec-discover

Stack

sandman also supports mixing in packages from a stack snapshot package database.

$ sandman mix stack

This mixes in all packages from the default snapshot database into the current Cabal sandbox. The -o/--only options may be used to limit the packages to a minimal subset.

$ sandman mix stack -o text

Status

Sandman is stable enough for basic use cases but there are surely a lot of unexplored corner cases. Feel free to try it out. Keep in mind that since you're breaking sandbox boundaries, there is a higher chance of running into version conflicts.

Installation

You can download and install sandman from Hackage by using,

$ cabal install sandman

Or if you would rather not pollute your global package database, install it into a sandbox and copy the executable somewhere on your $PATH.

$ mkdir tmp && cd tmp
$ cabal sandbox init
$ cabal install sandman
$ cp .cabal-sandbox/bin/sandman ~/bin

Or simply use stack:

$ stack install sandman