6

これにつまずく未来の魂のために編集:

以下のコマンドをコピーするのは賢明ではありません。実行しないでください。なぜ私がこれに間違ってアプローチしていたのかについては、ゼータの答えをチェックしてください.

元の質問

私のサンドボックスは、サンドボックス バージョンを使用するのではなく、一部のパッケージのグローバル バージョンに引っかかっているようです。私はこれに対する答えを求めてSOを見回しましたが、多くの質問はこれを解決するための具体的な指示なしに答えられているか、わずかに異なっていたため、セットアップを実行できないようです. ここに私が持っているものがあります:

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.

えーと、baseは互換性がないのでOK。

$ 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」フラグが私のベストショットだったので、エラーメッセージがこれを行う方法についてもう少し教えてくれたらいいのにと思います。

さて、それは 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

このステップには解決済みの問題があるようですが、それは別の問題のようです。

4

1 に答える 1

11

ステージの裏側 (または: ベースの特別なところ)

のバージョンはbase、GHC バージョンと密結合されています。たとえば、base-4.6.0.1GHC 7.6.3 に同梱されています。互換性のない GHC バージョンで別のバージョンの base を使用することはできません。を使用するにはbase-4.7.0.x、GHC 7.8.x が必要です。

したがって、ローカル サンドボックスを に使用することはできませんbase。これは、サンドボックス化できない (非常に数少ない) パッケージの 1 つです。

サンドボックスには強力な基盤が必要です

比喩的にサンドボックスの概念を取ると、サンドボックスには何らかの基盤が必要であることがすぐにわかります。そして、それはまさにbaseです。他のすべてはサンドボックスに置くことができ、動作するはずです:

サンドボックスの使用方法を教えてください。

サンドボックスを正しく使用していますが、適切なコンパイラ/ベースがインストールされていません。

なぜカバールが自分自身を矛盾した状態にアップグレードさせて、何もできないのか理解できません。

繰り返しますが、Cabal は一貫性のない状態ではありません。Framesは最小ベース バージョンを に制限し4.7ます。これは通常、GHC 7.8 で導入された GHC 機能を使用することを意味します。をインストールできたとしても、base-4.7.x.yそれらの GHC 機能を見逃してしまいます。

ただし、古いバージョンの GHC で最新バージョンの Cabal を使用することはお勧めしません。

他の下限を試す

ただし、ライブラリの下限が厳しすぎる場合があります。おそらくGHC 7.6で動作しますFrames これはローカルで確認できます。

$ cabal unpack Frames
$ cd Frames-*
$ vim Frames.cabal # change the min base to something lower
$ cabal sandbox init
$ cabal build

これが機能する場合、フレームの下限baseは実際には高すぎるため、ライブラリにプル リクエストを提出できます。

古いディストリビューションで新しいものを入手する

現在、これには 4 つの方法があります。難易度の低い順に:

  1. GHC のダウンロード ページから手動で GHC と Cabal をインストールします(経験豊富なユーザーのみにお勧めしません)。
  2. GHC と Cabal の最小バージョンをインストールします。 MinGHCを参照してください。
  3. 最新バージョンのHaskell プラットフォームを手動でインストールします (事前に古いバージョンを削除することを忘れないでくださいapt-get。LTS ディストリビューションのパッケージではなく、シェル スクリプトを使用してください)。
  4. スタックをインストールして使用しますstack setup(最も簡単なもの)。

ここでは、MinGHC と Stack に焦点を当てます。これらは、複数の GHC バージョンを相互にインストールする簡単な方法を提供するからです。

MinGHC のインストール (Linux 固有)

基本的にはこのサイトの指示に従ってください。Ubuntu では、サードパーティのソースをソースに追加し、Cabal と GHCの特定aptのバージョンをインストールする必要があります。これにより 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 *コマンドを使用できます。

また、Cabal に関する Stephen Diel のメモを読むことをお勧めします。これらは、一般的に使用されるいくつかの機能に関する優れた洞察を提供します。

スタックの使用

繰り返しますが、このサイトの指示に従ってください。基本的には同じです: 外部ソースを追加し、それらのソースを信頼するようディストリビューションに指示します:

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

その後、stack init既存の Cabal プロジェクトで を使用するかstack new、新しいプロジェクトをインストールする必要があります。その後にstack setup、かなり最近のバージョンの GHC がインストールされます。

$ stack new my-project
$ cd my-project
$ stack setup
# Loooooooooooooooooooooooong log, installs GHC in background

stackすべての依存関係を「適切な」方法でインストールすることに注意してください。内部 LTS システムを使用しているため、cabal サンドボックスを使用する必要はありません。ただし、Cabal コマンドは使用できなくなり、代わりにstack buildまたはを使用する必要がありstack ghcます。

パッケージを使用しない場合は、次のようになります

stack ghc --package Frames -- -O2 --make -rtsopts File1.hs File2.hs

可能です。ただし、スタックのすべての機能を文書化すると、この回答の範囲が崩れ、すぐに古くなってしまうため、ドキュメントをご覧ください。

于 2016-01-25T09:52:41.113 に答える