How to handle following dependency conflict in Cabal? - haskell

When I try to add scotty package to my multi-project cabal file, I get following dependency conflict. I am not exactly sure what it means.
harshal#Harshals-Linux hello-haskell % cabal build
Resolving dependencies...
Error: cabal: Could not resolve dependencies:
[__0] trying: playground-0.1.0.0 (user goal)
[__1] trying: scotty-0.12.1 (dependency of playground)
[__2] trying: warp-3.3.23 (dependency of scotty)
[__3] trying: unix-compat-0.6 (dependency of warp)
[__4] trying: unix-2.7.3/installed-2.7.3 (dependency of warp)
[__5] next goal: directory (dependency of playground)
[__5] rejecting: directory-1.3.7.1/installed-1.3.7.1 (conflict: playground =>
directory>=1.3.8.0)
[__5] rejecting: directory-1.3.8.0 (conflict: unix==2.7.3/installed-2.7.3,
directory => unix>=2.8.0 && <2.9)
[__5] rejecting: directory-1.3.7.1 (conflict: playground =>
directory>=1.3.8.0)
[__5] skipping: directory-1.3.7.0, directory-1.3.6.2, directory-1.3.6.1,
directory-1.3.6.0, directory-1.3.5.0, directory-1.3.4.0, directory-1.3.3.2,
directory-1.3.3.1, directory-1.3.3.0, directory-1.3.2.2, directory-1.3.2.1,
directory-1.3.2.0, directory-1.3.1.5, directory-1.3.1.4, directory-1.3.1.3,
directory-1.3.1.2, directory-1.3.1.1, directory-1.3.1.0, directory-1.3.0.2,
directory-1.3.0.1, directory-1.3.0.0, directory-1.2.7.1, directory-1.2.7.0,
directory-1.2.6.3, directory-1.2.6.2, directory-1.2.5.1, directory-1.2.5.0,
directory-1.2.4.0, directory-1.2.3.1, directory-1.2.3.0, directory-1.2.2.1,
directory-1.2.2.0, directory-1.2.1.0, directory-1.2.0.1, directory-1.2.0.0,
directory-1.1.0.2, directory-1.1.0.1, directory-1.1.0.0, directory-1.0.1.2,
directory-1.0.1.1, directory-1.0.1.0, directory-1.0.0.3, directory-1.0.0.0,
directory-1.2.6.1 (has the same characteristics that caused the previous
version to fail: excluded by constraint '>=1.3.8.0' from 'playground')
[__5] fail (backjumping, conflict set: directory, playground, unix)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: directory, unix, playground,
unix-compat, warp, unix-compat:portable, scotty
Try running with --minimize-conflict-set to improve the error message.
How can I resolve this dependency conflict?

What this says:
playground-0.1.0.0 depends on directory >= 1.3.8.0
directory-1.3.8.0 is the only apparent solution to directory >= 1.3.8.0
directory-1.3.8.0 depends on unix >= 2.8.0 && <2.9
we already committed to unix==2.7.3, which does not satisfy that constraint
One thing you could try, therefore, is to give it a hint that you want to pick a newer unix, by adding a top-level constraint:
% cabal build --constraint `unix >=2.8.0 && <2.9`
Top-level constraints are "available" earlier than constraints found via searching for dependencies, and so can constrain earlier choices better. (I believe this property -- that constraints get solved and committed to in some not-totally-user-visible order -- is to make the dependency resolution algorithm more efficient. Bummer.)

Related

Cabal install error with conflicting constraints

So right now I'm trying to run cabal install --lib bytestring, seems simple enough. But every time I run this I get this error message:
Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] next goal: bytestring (user goal)
[__0] rejecting: bytestring-0.11.3.1, bytestring-0.11.3.0,
bytestring-0.11.2.0, bytestring-0.11.1.0, bytestring-0.11.0.0,
bytestring-0.10.12.1 (constraint from user target requires ==0.10.12.0)
[__0] rejecting: bytestring-0.10.12.0/installed-0.10.12.0,
bytestring-0.10.12.0 (constraint from user target requires ==0.11.3.1)
[__0] rejecting: bytestring-0.10.10.1, bytestring-0.10.10.0,
bytestring-0.10.9.0, bytestring-0.10.8.2, bytestring-0.10.8.1,
bytestring-0.10.8.0, bytestring-0.10.6.0, bytestring-0.10.4.1,
bytestring-0.10.4.0, bytestring-0.10.2.0, bytestring-0.10.0.2,
bytestring-0.10.0.1, bytestring-0.10.0.0, bytestring-0.9.2.1,
bytestring-0.9.2.0, bytestring-0.9.1.10, bytestring-0.9.1.9,
bytestring-0.9.1.8, bytestring-0.9.1.7, bytestring-0.9.1.6,
bytestring-0.9.1.5, bytestring-0.9.1.4, bytestring-0.9.1.3,
bytestring-0.9.1.2, bytestring-0.9.1.1, bytestring-0.9.1.0,
bytestring-0.9.0.4, bytestring-0.9.0.3, bytestring-0.9.0.2,
bytestring-0.9.0.1, bytestring-0.9 (constraint from user target requires
==0.10.12.0)
[__0] fail (backjumping, conflict set: bytestring)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: bytestring
It appears that cabal has conflicting constraints that prevent it from installing 0.10.12.0 or 0.11.3.1 (fyi: i'm trying to use 0.10.12.0). How can I remove the "version==0.11.3.1" constraint? ty.

Dificoulties installing gloss and other packages with cabal

I am trying to install gloss but, I dont know why ghci doesn't find the modules.
When I do cabal install gloss it says:
Up to date
Warning: You asked to install executables, but there are no executables in
target: gloss. Perhaps you want to use --lib to install libraries instead.
When I do cabal install -lib gloss it gives me thies error:
Resolving dependencies...
cabal.exe: Could not resolve dependencies:
[__0] trying: bytestring-0.11.0.0 (user goal)
[__1] next goal: directory (user goal)
[__1] rejecting: directory-1.3.6.1 (constraint from user target requires
==1.3.6.0)
[__1] trying: directory-1.3.6.0/installed-1.3.6.0
[__2] next goal: Win32 (dependency of directory)
[__2] rejecting: Win32-2.6.1.0/installed-2.6.1.0 (conflict:
bytestring==0.11.0.0, Win32 => bytestring==0.10.10.0/installed-0.10.10.0)
[__2] rejecting: Win32-2.10.1.0, Win32-2.10.0.0, Win32-2.9.0.0, Win32-2.8.5.0,
Win32-2.8.4.0, Win32-2.8.3.0, Win32-2.8.2.0, Win32-2.8.1.0, Win32-2.8.0.0,
Win32-2.7.0.0, Win32-2.6.2.0, Win32-2.6.1.0, Win32-2.6.0.0, Win32-2.5.4.1,
Win32-2.5.3.0, Win32-2.5.2.0, Win32-2.5.1.0, Win32-2.5.0.0, Win32-2.4.0.0,
Win32-2.3.1.1, Win32-2.3.1.0, Win32-2.3.0.2, Win32-2.3.0.1, Win32-2.3.0.0,
Win32-2.2.2.0, Win32-2.2.1.0, Win32-2.2.0.2, Win32-2.2.0.1, Win32-2.2.0.0,
Win32-2.1.0.0, Win32-2.1, Win32-2.5.4.0 (conflict: directory =>
Win32==2.6.1.0/installed-2.6.1.0)
[__2] fail (backjumping, conflict set: Win32, bytestring, directory)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: ghc, bytestring, Win32, directory
Try running with --minimize-conflict-set to improve the error message.
This is very strange because the firs time I used this command it worked perfectly but then when I tried to do on ghci ´´´import ...´´´ it sayd: Module not found.
I have tried other modules and it gives me the same error. I thought that the issue could be that ghc is not able to search in the cabal folder where the packages are saved but I am no longer sure.
How can I fix this? Thanks

Trouble cabal installing http-conduit

When I run cabal install http-conduit, I get the following:
Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] trying: base-4.12.0.0/installed-4.1... (user goal)
[__1] trying: ghc-8.6.5/installed-8.6... (user goal)
[__2] next goal: process (user goal)
[__2] rejecting: process-1.6.7.0 (constraint from user target requires
==1.6.6.0)
[__2] rejecting: process-1.6.6.0 (conflict: ghc =>
process==1.6.5.0/installed-1.6...)
[__2] rejecting: process-1.6.5.1, process-1.6.5.0/installed-1.6...,
process-1.6.5.0, process-1.6.4.0, process-1.6.3.0, process-1.6.2.0,
process-1.6.1.0, process-1.6.0.0, process-1.5.0.0, process-1.4.3.0,
process-1.4.2.0, process-1.4.1.0, process-1.4.0.0, process-1.3.0.0,
process-1.2.3.0, process-1.2.2.0, process-1.2.1.0, process-1.2.0.0,
process-1.1.0.2, process-1.1.0.1, process-1.1.0.0, process-1.0.1.5,
process-1.0.1.4, process-1.0.1.3, process-1.0.1.2, process-1.0.1.1,
process-1.0.0.0 (constraint from user target requires ==1.6.6.0)
[__2] fail (backjumping, conflict set: ghc, process)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: process, base, ghc
I'm running cabal v3.0.0.0 and ghc v8.6.5
I'm quite new to the Haskell ecosystem, so any help I could get would be greatly appreciated. Thanks!
It looks like you have a dependency conflict, one package requires a different version than the package you are trying to install. This can be very difficult to solve for new users.
If you are new to Haskell and want to start using dependencies from Hackage, the centralized package archive for Haskell, I recommend using stack (install instructions and basic workflow. stack is a tool built on top of cabal that includes a curated list of package versions that are compatible. It should make it easier for you to get started.

Workarounds for Haskell / cabal packages with constraints with Nix and Cabal?

I recently got into developing with reflex-platform, with some extra configuration similar to what is described in the excellent reflex-project-skeleton.
Now I am having a package conflict that I am unable to resolve.
I use the same cabal script as reflex-project-skeleton, which invokes nix-shell in non-interactive mode with a cabal command.
If I try
./cabal new-build --allow-newer all
I get
these derivations will be built:
/nix/store/d6ji516i7pry5l6gv18y6hpj9k1bvgg5-heist-1.0.1.0.drv
/nix/store/zj1clks7mzq8gn91ahhwa3nvpi5rwra9-snap-1.0.0.2.drv
/nix/store/mx861972jnjabn7yxyr3y3q1yhf25jfq-snaplet-acid-state-0.2.7.drv
/nix/store/grhp4dhavmpi6bgns5a6vdzg8ny2bsf8-hoogle-local-0.1.drv
/nix/store/y3sszsj58f6ad3r06540w0mlr1pncd59-ghc-8.0.2-with-packages.drv
...
Configuring heist-1.0.1.0...
Setup: Encountered missing dependencies:
aeson >=0.6 && <1.2
builder for '/nix/store/d6ji516i7pry5l6gv18y6hpj9k1bvgg5-heist-1.0.1.0.drv' failed with exit code 1
cannot build derivation '/nix/store/y3sszsj58f6ad3r06540w0mlr1pncd59-ghc-8.0.2-with-packages.drv': 1 dependencies couldn't be built
The offending package appears to be snaplet-acid-state, so I tried installing it from inside the nix-shell:
cabal install snaplet-acid-state
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: snaplet-acid-state-0.2.7 (user goal)
trying: base-4.9.1.0/installed-4.9... (dependency of snaplet-acid-state-0.2.7)
next goal: mtl (dependency of snaplet-acid-state-0.2.7)
rejecting: mtl-2.2.1/installed-BLK... (conflict: mtl =>
transformers==0.5.2.0/installed-0.5..., snaplet-acid-state =>
transformers>=0.3.0.0 && <0.5)
trying: mtl-2.2.2
next goal: transformers (dependency of snaplet-acid-state-0.2.7)
rejecting: transformers-0.5.2.0/installed-0.5..., transformers-0.5.5.0,
transformers-0.5.4.0, transformers-0.5.2.0, transformers-0.5.1.0,
transformers-0.5.0.1, transformers-0.5.0.0 (conflict: snaplet-acid-state =>
transformers>=0.3.0.0 && <0.5)
rejecting: transformers-0.4.3.0, transformers-0.4.2.0 (conflict:
base==4.9.1.0/installed-4.9..., transformers => base>=2 && <4.9)
rejecting: transformers-0.4.1.0 (conflict: base==4.9.1.0/installed-4.9...,
transformers => base>=2 && <4.8 || >=1.0 && <2)
rejecting: transformers-0.3.0.0 (conflict: mtl => transformers>=0.4 && <0.6)
rejecting: transformers-0.2.2.1, transformers-0.2.1.0, transformers-0.2.0.0,
transformers-0.1.4.0, transformers-0.1.3.0, transformers-0.1.1.0,
transformers-0.1.0.1, transformers-0.0.1.0, transformers-0.0.0.0,
transformers-0.5.3.1, transformers-0.5.3.0, transformers-0.5.0.2 (conflict:
snaplet-acid-state => transformers>=0.3.0.0 && <0.5)
rejecting: transformers-0.4.0.0 (conflict: base==4.9.1.0/installed-4.9...,
transformers => base>=2 && <4.8 || >=1.0 && <2)
rejecting: transformers-0.2.2.0, transformers-0.1.0.0 (conflict:
snaplet-acid-state => transformers>=0.3.0.0 && <0.5)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: transformers, snap, base,
snaplet-acid-state, mtl
Tried specifying a version constraint in the cabal file, among other things, but to no effect.
Any clues? I'm not even sure what the exact issue is. Why is aeson failing to install in the first instance, and there is a conflict between snaplet-acid-state and mtl in the second?
What happens with this cabal2nix workflow is that basically the dependency solver is forced to only consider the packages that have been provided by Nixpkgs, or in this case reflex-platform + Nixpkgs. By taking away the freedom to pick one of multiple versions, the Cabal dependency solver is reduced to a dependency checker.
Now, if the version bound is too strict, you can consider what is called 'jailbreaking' in Nixpkgs: removing all version bounds from the cabal file. The other option is to change package versions.
Gabriel Gonzalez has written a good explanation of version management with Nixpkgs' Haskell infrastructure. You may also check out this thread. It's a bit verbose, but it discusses the callHackage and callCabal2nix functions that are quite helpful.

`cabal-install` refuses to solve conflicting `ghc` and `containers` versions

This repository contains a reproduction for an annoying error I got while using doctest in a test-suite.
cabal-installs solver fails to find a solution for this build-depends field using GHC 8.0.2:
build-depends:
base >= 4.7 && < 5
, doctest == 0.11.4
, containers == 0.5.10.2
Note that doctest depends transitively depends on ghc-8.0.2, which itself depends on containers-0.5.7.1, conflicting with my own constraints.
That's basically what cabal install is trying to tell me:
Resolving dependencies...
cabal.exe: Could not resolve dependencies:
next goal: containers (dependency of repro-0.1.0.0)
rejecting: containers-0.5.7.1/installed-0.5... (conflict: repro =>
containers==0.5.10.2)
trying: containers-0.5.10.2
next goal: doctest (dependency of repro-0.1.0.0)
rejecting: doctest-0.13.0, doctest-0.12.0 (conflict: repro => doctest==0.11.4)
trying: doctest-0.11.4
next goal: ghc (dependency of doctest-0.11.4)
rejecting: ghc-8.0.2/installed-8.0... (conflict: containers==0.5.10.2, ghc =>
containers==0.5.7.1/installed-0.5...)
Dependency tree exhaustively searched.
Now, what bugs me is that stack install works just fine using lts-9 and an extra-deps for the containers version.
So in theory, cabal-install could also do 'the right thing' here. How can I tell it to?

Resources