After using Haskell in production for awhile this is my go-to method for minimizing pain when dealing with dependencies. As long as you follow these steps you should be able to deal with most dependency issues.

1. NEVER use cabal, always use cabal-dev. Preferably with latest version that supports parallelized builds with -j<cores>. It's just not worth having your builds break all the time. Rebuilding the world isn't too bad with -j12 and cabal won't trip up as much trying to resolve version conflicts. Sometimes you will get a "this will break existing packages" message when using cabal-dev but I think that's just because cabal is confused, --force-reinstalls is your friend in this situation and shouldn't really break anything because it's a sandboxed build.

2. Make a directory called lib in your project and drop any of your dependencies in there, then your build rule will be the same for all your projects: 

cabal-dev install . ./lib*

This is handy because now you can drop any misbehaving packages in your lib folder if you need to fix any version conflicts (although I don't find myself doing this much)

3. Dealing with version conflicts:

In my experience most version conflicts are caused by unnecessary upper bound constraits (4.*, && < 5.0). I'd recommend anyone writing packages to only include these if you know the newer version actually breaks something or causes unacceptable performance changes. All my projects only have lower bounds (>= v) and I've never had any problems with dependency issues between my packages.

If you get to this point and you still have a misbehaving package, simply download the tarball from hackage and drop it in your lib folder, remove upper bounds, and voila, it will work most of the time.

Cheers,
Bill


On Wed, Dec 5, 2012 at 1:52 PM, Ivan Perez <ivanperezdominguez@gmail.com> wrote:
Hello everyone,

I've spent the last couple of days fighting my way around a dependency
hell with my own libraries and packages.

If I install them package by package (by hand), I'm very likely to hit
one of these conflicts that I'm talking about. A simple example of
something that did happen:
- Package A depends on bytestring, and is compatible with both 0.9.* and 0.10.*
- Package B depends on ghc, which I installed using the package
manager and which depends on bytestring 0.9.2
- Package B depends on package A.

I do not want to add to the cabal files that B depends on bytestring
0.9.*, because it's not true, or that A depends on bytstring 0.9,
because it's also not true.

I would like to the best approach to 1) avoid these situations and 2)
fix them when they happen.

Regarding (2), Is there any way to automatically rebuild all the
broken packages?
Regarding (1), I thought about using cabal-dev, but I think I'll just
have the same problem, won't I? After all, I started from a clean
fresh ghc installation and I just installed what I needed to make my
program run.
I also thought about adding process, bytestring and other global
packages to the list of constraints in ~/.cabal/config. Would this be
a good approach, or will it lead to bigger headaches in the future
(for instance, in the form of programs that just cannot be installed
at all)?

Also, is there any way to detect potential dependency hells without
having to install a package? (Some tool that will analyse the
dependency information (statically) and determine more strict or
incorrect upper and lower bounds for the dependencies of a package.)

Cheers,
Ivan

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe