cabal sandbox地狱:无法解决因素

时间:2017-09-08 13:04:30

标签: haskell sandbox cabal

我正在尝试使用沙箱构建我的包。没有它,它会编译并像魅力一样工作。一旦我介绍了一个沙箱,虽然cabal说它无法解决依赖关系。在我看来,这些冲突看起来并不像是冲突。

项目结构如下:

application (depends on library-base, library-impl1 and library-impl2)

library
 ├ library-base
 ├ library-impl1 (depends on library-base)
 └ library-impl2 (depends on library-base)

这些是我按顺序运行的命令

rm -rf ~/.cabal
rm -rf ~/.ghc
cabal update
rm -f  cabal.sandbox.config
rm -rf .cabal-sandbox
cabal sandbox init
cabal sandbox add-source $LIB_HOME/library-base
cabal sandbox add-source $LIB_HOME/library-impl1
cabal sandbox add-source $LIB_HOME/library-impl2
cabal install --only-dependencies --force-reinstalls && cabal build

cabal install --only-dependencies --force-reinstalls产生以下输出:

Resolving dependencies...
cabal: Could not resolve dependencies:
next goal: lens (dependency of library-base-0.1.0.0)
rejecting: lens-4.15.4/installed-I5C... (conflict: bifunctors==5.4.2, lens =>
bifunctors==5.4.2/installed-Hs7...)
trying: lens-4.15.4
trying: unordered-containers-0.2.8.0/installed-1tq... (dependency of
lens-4.15.4)
next goal: text (dependency of lens-4.15.4)
rejecting: text-1.2.2.2/installed-3EN... (conflict: binary==0.8.5.1, text =>
binary==0.8.3.0/installed-0.8...)
trying: text-1.2.2.2
next goal: hashable (dependency of lens-4.15.4)
rejecting: hashable-1.2.6.1/installed-2nP... (conflict: text==1.2.2.2,
hashable => text==1.2.2.2/installed-3EN...)
rejecting: hashable-1.2.6.1, hashable-1.2.6.0, hashable-1.2.5.0,
hashable-1.2.4.0, hashable-1.2.3.3, hashable-1.2.3.2, hashable-1.2.3.1,
hashable-1.2.3.0, hashable-1.2.2.0, hashable-1.2.1.0, hashable-1.2.0.10,
hashable-1.2.0.9, hashable-1.2.0.8, hashable-1.2.0.7, hashable-1.2.0.6,
hashable-1.2.0.5, hashable-1.2.0.4, hashable-1.2.0.3, hashable-1.2.0.2,
hashable-1.2.0.1, hashable-1.2.0.0, hashable-1.1.2.5, hashable-1.1.2.4,
hashable-1.1.2.3, hashable-1.1.2.2, hashable-1.1.2.1, hashable-1.1.2.0,
hashable-1.1.1.0, hashable-1.1.0.0, hashable-1.0.1.1, hashable-1.0.1.0,
hashable-1.0.0 (conflict: unordered-containers =>
hashable==1.2.6.1/installed-2nP...)
Dependency tree exhaustively searched.

有没有人知道这里发生了什么?

1 个答案:

答案 0 :(得分:3)

首先,我将解释错误消息所说的内容。然后我将尝试对为什么会出现错误进行一些猜测。然后我会提出一些后续步骤。

错误说:

  1. 也许版本4.15.4的镜头会起作用。
  2. 也许已安装的0.2.8.0版本的无序容器将满足镜头的需求。对无序容器的依赖。
  3. 也许已安装的1.2.2.2版文本将满足镜头'对文本的依赖。
  4. 垃圾。您要求提供二进制版本0.8.5.1,但已安装的文本版本是针对0.8.3.0版本构建的。我必须重建文字。
  5. 也许已安装的版本1.2.6.1版本的hashable将满足镜头'依赖于hashable。
  6. 垃圾。我们正在重建文本,一个可以依赖的文本。我必须重建hashable。
  7. 双重废话。我们已经承诺使用已安装的无序容器版本,这取决于已安装的hashable版本,这会阻止我们重建hashable。
  8. (......我尝试过其他一些也不起作用的东西,但我没告诉你什么,nya nya nya)
  9. 通常沙盒会忽略本地包数据库,所以这告诉我它在哪里谈论"已安装的版本"上面是从您的全局包数据库或现有的沙箱中选择它们。您声称刚刚创建了此沙箱并立即运行此cabal install命令。如果这是真的(是吗?或者这是该工具的第二次运行?为什么你有--force-reinstalls?),它无法从你的沙箱中挑选已安装的版本,因此必须从你的沙箱中挑选它们全局包数据库。将内容安装到全局包数据库通常被认为是一个坏主意,因为正确清除混乱/损坏的全局包数据库要困难得多。在未来的建议下接受它。

    现在,为了取得进步,我会尝试以下两种方法之一:

    1. 您可以控制的上述错误解释的唯一部分是"您要求版本0.8.5.1的二进制"部分。考虑放宽对二进制文件的版本约束以接受已安装的版本0.8.3.0。
    2. 通过减少搜索空间,您通常可以从cabal中获得明显更好的错误消息;因为它只会在错误中打印搜索空间的一部分,所以有时需要将其引导到空间中有问题的部分,这样它就会向您显示错误中的真正问题。如果您非常确定已安装的unordered-containers等版本与您的库很匹配,请考虑

      cabal install --only-dependencies --constraint 'unordered-containers installed' --constraint 'binary installed'
      

      等等,它提到尝试重建的任何其他软件包,你不希望它重建。或者,如果您不想要其中一个已安装的版本,则可以在--constraint中添加确切的版本约束。不要包括--force-reinstalls,基本上都是。