Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"cabal install ___" breaks previously installed packages

Tags:

haskell

ghc

cabal

I find cabal's behavior when installing packages maddening. For example, running

cabal install funsat

installed old versions of array, time, random, quickcheck, and bitset, breaking packages like monadiccp, hoogle, heist, snap, etc.

It works to go back and cabal install monadiccp, etc., but how can I avoid the default behavior of cabal breaking installed packages? Any reasonable Linux package manager, like aptitude or zypper would ask whether I wanted to break already installed packages, when installing a new package.

Has anyone cooked up a workaround script? Thanks in advance.

like image 403
gatoatigrado Avatar asked Jan 10 '12 03:01

gatoatigrado


2 Answers

I recommend cabal-dev, which maintains a separate set of installed packages for each project you work on. That doesn't solve the bad behaviour of cabal-install in general, but means that such failures are more isolated than they would otherwise be, and allows you to fix them more easily by simply doing cabal-dev clean && cabal-dev install.

The added benefit of reproducible builds is also nice.

Admittedly, this isn't a workaround for your specific problem, but it lessens cabal-install pain in general.


Building on Daniel Fischer's answer, here's a wrapper for cabal that aborts an installation if it would reinstall a package:

cabal () {
  if [ "$1" = "install" ]; then
    local out=$(command cabal --dry-run -v2 "$@" 2>&1)
    if echo "$out" | egrep -c '\((reinstall|new version)\)' >/dev/null; then
      echo "$out"
      return 1
    fi
  fi
  command cabal "$@"
}

YMMV; I've only lightly tested this and it causes an annoying delay at start-up as all the dependencies have to be calculated twice. But it should relieve some tedium if you want to stay on the safe side.

like image 57
ehird Avatar answered Oct 31 '22 16:10

ehird


Workaround: always check with --dry-run first. If cabal would reinstall any package, watch out.

like image 24
Daniel Fischer Avatar answered Oct 31 '22 17:10

Daniel Fischer