Cabal 安装沙箱无法重新安装基础或任何其他依赖项
Cabal install sandbox can't reinstall base or any other dependencies
为未来的灵魂编辑:
复制下面我的任何命令都是不明智的,不要执行它们。只需查看 Zeta 的回答,了解我为什么不正确地处理这个问题。
原始问题
我的沙箱似乎被某些包的全球版本捕获,而不是使用沙箱版本。我在 SO 上四处寻找这个问题的答案,许多问题的回答没有具体的说明来解决这个问题,或者略有不同,所以我似乎无法得到我的设置 运行ning。这是我拥有的:
1. Version of cabal is old:
$ cabal --v
cabal-install version 1.16.0.2
using version 1.16.0 of the Cabal library
哦,天哪,这是旧的,不会 运行 沙盒。
2. Install cabal with cabal
$ cabal install cabal
Resolving dependencies...
Downloading Cabal-1.22.6.0...
...lots of stuf...
Registering Cabal-1.22.6.0...
Installed Cabal-1.22.6.0
看起来不错。
3. Try it out:
$ cabal sandbox init
cabal: unrecognised command: sandbox (try --help)
嗯。
$ which cabal
/usr/bin/cabal
啊。
$ ${HOME}/.cabal/bin/cabal --version
cabal-install version 1.22.2.0
using version 1.22.2.0 of the Cabal library
啊哈。
$ export PATH="${HOME}/.cabal/bin/:$PATH"
$ export PATH="${HOME}/.cabal/libs/:$PATH"
$ cabal --v
cabal-install version 1.22.2.0
太棒了。
4. Try it out again:
$ cabal sandbox init
Writing a default package environment file to
.../cabal.sandbox.config
Creating a new sandbox at .../.cabal-sandbox
$ cabal install Frames
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0, 4.6.0.1,
4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0, 4.3.0.0, 4.2.0.2,
4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global constraint
requires installed instance)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
嗯,所以基地不兼容,好吧。
$ cabal install base --reinstall
Resolving dependencies...
cabal: Could not resolve dependencies:
next goal: base (user goal)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0, 4.6.0.1,
4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0, 4.3.0.0, 4.2.0.2,
4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0 (only already installed instances can be
used)
rejecting: base-3.0.3.2 (conflict: base => base>=4.0 && <4.3)
rejecting: base-3.0.3.1 (conflict: base => base>=4.0 && <4.2)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
咦,所有的依赖项呢?
$ cabal install --upgrade-dependencies
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0 (global
constraint requires installed instance)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.6.0.1, 4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0,
4.3.0.0, 4.2.0.2, 4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global
constraint requires installed instance)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
似乎我不能 reinstall/unregister 有问题的包。我希望错误消息能给我更多关于如何执行此操作的信息,因为“--reinstall”标志是我最好的选择。
好吧,它提供了 2 个解决方案,让我们试试另一个,重新创建沙箱。
$ cabal sandbox delete
Deleting the sandbox located at .../.cabal-sandbox
$ cabal sandbox init
Writing a default package environment file to
.../cabal.sandbox.config
Creating a new sandbox at .../.cabal-sandbox
$ cabal install --upgrade-dependencies
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0 (global
constraint requires installed instance)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.6.0.1, 4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0,
4.3.0.0, 4.2.0.2, 4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global
constraint requires installed instance)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
这也没有帮助。新鲜的想法。如何使用沙盒?我在这里读到的是有一个全球性的东西导致了问题。一个沙箱不应该被沙箱的设计所困扰,对吧?
如果对上下文有帮助,我只是想 运行 Frames 的演示:
https://github.com/acowley/Frames
...即:
$ cabal sandbox init
$ cabal install --dependencies-only -f demos # <-- here
我看到这一步有一个 closed issue,但这似乎是一个不同的问题。
幕后一瞥(或:基地的特别之处)
base
的版本与 GHC 版本紧密耦合。例如,base-4.6.0.1
随 GHC 7.6.3 一起提供。您不能 将其他版本的 base 与不兼容的 GHC 版本一起使用。为了使用 base-4.7.0.x
,您需要 GHC 7.8.x.
因此,您不能为 base
使用本地沙箱。它是(极少数)无法进入沙盒的软件包之一。
沙盒需要强大的基础
如果我们使用 沙盒 的形象化概念,我们很快就会发现沙盒需要某种基础。那就是 base
。其他一切都可以存在于沙箱中,并且应该可以工作:
How do I use sandbox?
您正确使用了沙箱,但没有安装正确的compiler/base。
I don't understand why cabal let me upgrade itself into a state so inconsistent I can't do anything.
同样,Cabal 并非处于不一致状态。 Frames
将最低基础版本限制为 4.7
,这通常意味着它使用 GHC 7.8 引入的 GHC 功能。即使您能够安装 base-4.7.x.y
,您仍然会错过那些 GHC 功能。
但是,不建议将最新版本的 Cabal 与旧版本的 GHC 一起使用。
尝试其他下限
但是,有时库的下限过于严格。也许 Frames
可以与 GHC 7.6 一起使用。您可以在本地查看:
$ cabal unpack Frames
$ cd Frames-*
$ vim Frames.cabal # change the min base to something lower
$ cabal sandbox init
$ cabal build
如果可行,Frames 中 base
的下限实际上太高了,您可以在库中提交 pull-request。
在旧发行版中获取新内容
现在有四种方法。按难度递减顺序排列:
- 从 GHC download page 手动安装 GHC 和 Cabal(不推荐,仅适用于有经验的用户)。
- 安装最小版本的 GHC 和 Cabal,请参阅 MinGHC。
- 手动安装 Haskell platform 的最新版本(不要忘记事先删除旧版本;使用 shell 脚本,而不是通过
apt-get
的软件包在 LTS 发行版上)。
- 安装 stack 并使用
stack setup
(最简单的一个)。
我将重点介绍 MinGHC 和 Stack,因为它们提供了相互安装多个 GHC 版本的简单方法。
MinGHC 安装(Linux 具体)
基本上按照this site上的说明操作。在 Ubuntu 上,您必须将第三方源添加到 apt
源并安装 specific 版本的 Cabal 和 GHC。请注意,这会将 GHC 和 Cabal 安装到 /opt/
,因此您必须在路径中添加一些目录:
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:hvr/ghc
sudo apt-get update
sudo apt-get install -y cabal-install-1.22 ghc-7.10.3
cat >> ~/.bashrc <<EOF
export PATH="$HOME/.cabal/bin:/opt/cabal/1.20/bin:/opt/ghc/7.10.3/bin:$PATH"
EOF
export PATH=~/.cabal/bin:/opt/cabal/1.22/bin:/opt/ghc/7.10.3/bin:$PATH
这使您可以使用
轻松安装其他版本的 cabal 和 GHC
sudo apt-get install -y cabal-install-1.xx ghc-7.yy.z
然后更改您的 PATH
变量。之后,您可以使用 cabal sandbox *
命令。
我也建议你阅读Stephen Diel's notes on Cabal。他们提供了一些常用功能的深刻见解。
使用堆栈
再次,按照 this site 上的说明进行操作。基本相同:您添加外部资源并告诉您的发行版信任这些资源:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 575159689BEFB442
echo 'deb http://download.fpcomplete.com/ubuntu trusty main' | sudo tee /etc/apt/sources.list.d/fpco.list
sudo apt-get update && sudo apt-get install stack -y
之后,您必须在已经存在的 Cabal 项目中使用 stack init
,或者 stack new
安装一个新项目,然后使用 stack setup
,这将安装一个相当新的版本GHC 的:
$ stack new my-project
$ cd my-project
$ stack setup
# Loooooooooooooooooooooooong log, installs GHC in background
请注意 stack
以 "sane" 方式安装所有依赖项。它使用内部 LTS 系统,您不必使用 cabal 沙箱。但是,您不能再使用 Cabal 命令,而必须使用 stack build
或 stack ghc
.
如果你不使用包,比如
stack ghc --package Frames -- -O2 --make -rtsopts File1.hs File2.hs
是可以的。但是,记录堆栈的每个功能会打破此答案的范围并很快过时,因此请查看 documentation.
为未来的灵魂编辑:
复制下面我的任何命令都是不明智的,不要执行它们。只需查看 Zeta 的回答,了解我为什么不正确地处理这个问题。
原始问题
我的沙箱似乎被某些包的全球版本捕获,而不是使用沙箱版本。我在 SO 上四处寻找这个问题的答案,许多问题的回答没有具体的说明来解决这个问题,或者略有不同,所以我似乎无法得到我的设置 运行ning。这是我拥有的:
1. Version of cabal is old:
$ cabal --v
cabal-install version 1.16.0.2
using version 1.16.0 of the Cabal library
哦,天哪,这是旧的,不会 运行 沙盒。
2. Install cabal with cabal
$ cabal install cabal
Resolving dependencies...
Downloading Cabal-1.22.6.0...
...lots of stuf...
Registering Cabal-1.22.6.0...
Installed Cabal-1.22.6.0
看起来不错。
3. Try it out:
$ cabal sandbox init
cabal: unrecognised command: sandbox (try --help)
嗯。
$ which cabal
/usr/bin/cabal
啊。
$ ${HOME}/.cabal/bin/cabal --version
cabal-install version 1.22.2.0
using version 1.22.2.0 of the Cabal library
啊哈。
$ export PATH="${HOME}/.cabal/bin/:$PATH"
$ export PATH="${HOME}/.cabal/libs/:$PATH"
$ cabal --v
cabal-install version 1.22.2.0
太棒了。
4. Try it out again:
$ cabal sandbox init
Writing a default package environment file to
.../cabal.sandbox.config
Creating a new sandbox at .../.cabal-sandbox
$ cabal install Frames
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0, 4.6.0.1,
4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0, 4.3.0.0, 4.2.0.2,
4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global constraint
requires installed instance)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
嗯,所以基地不兼容,好吧。
$ cabal install base --reinstall
Resolving dependencies...
cabal: Could not resolve dependencies:
next goal: base (user goal)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0, 4.6.0.1,
4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0, 4.3.0.0, 4.2.0.2,
4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0 (only already installed instances can be
used)
rejecting: base-3.0.3.2 (conflict: base => base>=4.0 && <4.3)
rejecting: base-3.0.3.1 (conflict: base => base>=4.0 && <4.2)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
咦,所有的依赖项呢?
$ cabal install --upgrade-dependencies
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0 (global
constraint requires installed instance)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.6.0.1, 4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0,
4.3.0.0, 4.2.0.2, 4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global
constraint requires installed instance)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
似乎我不能 reinstall/unregister 有问题的包。我希望错误消息能给我更多关于如何执行此操作的信息,因为“--reinstall”标志是我最好的选择。
好吧,它提供了 2 个解决方案,让我们试试另一个,重新创建沙箱。
$ cabal sandbox delete
Deleting the sandbox located at .../.cabal-sandbox
$ cabal sandbox init
Writing a default package environment file to
.../cabal.sandbox.config
Creating a new sandbox at .../.cabal-sandbox
$ cabal install --upgrade-dependencies
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0 (global
constraint requires installed instance)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.6.0.1, 4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0,
4.3.0.0, 4.2.0.2, 4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global
constraint requires installed instance)
Dependency tree exhaustively searched.
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
这也没有帮助。新鲜的想法。如何使用沙盒?我在这里读到的是有一个全球性的东西导致了问题。一个沙箱不应该被沙箱的设计所困扰,对吧?
如果对上下文有帮助,我只是想 运行 Frames 的演示:
https://github.com/acowley/Frames
...即:
$ cabal sandbox init
$ cabal install --dependencies-only -f demos # <-- here
我看到这一步有一个 closed issue,但这似乎是一个不同的问题。
幕后一瞥(或:基地的特别之处)
base
的版本与 GHC 版本紧密耦合。例如,base-4.6.0.1
随 GHC 7.6.3 一起提供。您不能 将其他版本的 base 与不兼容的 GHC 版本一起使用。为了使用 base-4.7.0.x
,您需要 GHC 7.8.x.
因此,您不能为 base
使用本地沙箱。它是(极少数)无法进入沙盒的软件包之一。
沙盒需要强大的基础
如果我们使用 沙盒 的形象化概念,我们很快就会发现沙盒需要某种基础。那就是 base
。其他一切都可以存在于沙箱中,并且应该可以工作:
How do I use sandbox?
您正确使用了沙箱,但没有安装正确的compiler/base。
I don't understand why cabal let me upgrade itself into a state so inconsistent I can't do anything.
同样,Cabal 并非处于不一致状态。 Frames
将最低基础版本限制为 4.7
,这通常意味着它使用 GHC 7.8 引入的 GHC 功能。即使您能够安装 base-4.7.x.y
,您仍然会错过那些 GHC 功能。
但是,不建议将最新版本的 Cabal 与旧版本的 GHC 一起使用。
尝试其他下限
但是,有时库的下限过于严格。也许 Frames
可以与 GHC 7.6 一起使用。您可以在本地查看:
$ cabal unpack Frames
$ cd Frames-*
$ vim Frames.cabal # change the min base to something lower
$ cabal sandbox init
$ cabal build
如果可行,Frames 中 base
的下限实际上太高了,您可以在库中提交 pull-request。
在旧发行版中获取新内容
现在有四种方法。按难度递减顺序排列:
- 从 GHC download page 手动安装 GHC 和 Cabal(不推荐,仅适用于有经验的用户)。
- 安装最小版本的 GHC 和 Cabal,请参阅 MinGHC。
- 手动安装 Haskell platform 的最新版本(不要忘记事先删除旧版本;使用 shell 脚本,而不是通过
apt-get
的软件包在 LTS 发行版上)。 - 安装 stack 并使用
stack setup
(最简单的一个)。
我将重点介绍 MinGHC 和 Stack,因为它们提供了相互安装多个 GHC 版本的简单方法。
MinGHC 安装(Linux 具体)
基本上按照this site上的说明操作。在 Ubuntu 上,您必须将第三方源添加到 apt
源并安装 specific 版本的 Cabal 和 GHC。请注意,这会将 GHC 和 Cabal 安装到 /opt/
,因此您必须在路径中添加一些目录:
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:hvr/ghc
sudo apt-get update
sudo apt-get install -y cabal-install-1.22 ghc-7.10.3
cat >> ~/.bashrc <<EOF
export PATH="$HOME/.cabal/bin:/opt/cabal/1.20/bin:/opt/ghc/7.10.3/bin:$PATH"
EOF
export PATH=~/.cabal/bin:/opt/cabal/1.22/bin:/opt/ghc/7.10.3/bin:$PATH
这使您可以使用
轻松安装其他版本的 cabal 和 GHCsudo apt-get install -y cabal-install-1.xx ghc-7.yy.z
然后更改您的 PATH
变量。之后,您可以使用 cabal sandbox *
命令。
我也建议你阅读Stephen Diel's notes on Cabal。他们提供了一些常用功能的深刻见解。
使用堆栈
再次,按照 this site 上的说明进行操作。基本相同:您添加外部资源并告诉您的发行版信任这些资源:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 575159689BEFB442
echo 'deb http://download.fpcomplete.com/ubuntu trusty main' | sudo tee /etc/apt/sources.list.d/fpco.list
sudo apt-get update && sudo apt-get install stack -y
之后,您必须在已经存在的 Cabal 项目中使用 stack init
,或者 stack new
安装一个新项目,然后使用 stack setup
,这将安装一个相当新的版本GHC 的:
$ stack new my-project
$ cd my-project
$ stack setup
# Loooooooooooooooooooooooong log, installs GHC in background
请注意 stack
以 "sane" 方式安装所有依赖项。它使用内部 LTS 系统,您不必使用 cabal 沙箱。但是,您不能再使用 Cabal 命令,而必须使用 stack build
或 stack ghc
.
如果你不使用包,比如
stack ghc --package Frames -- -O2 --make -rtsopts File1.hs File2.hs
是可以的。但是,记录堆栈的每个功能会打破此答案的范围并很快过时,因此请查看 documentation.