2011-09-15 8 views
8

私が取り組んでいるプロジェクトのためにcabal-devを試しています。プロジェクトはライブラリであり、そしてcabal-devはそれのサンドボックスバージョンを構築するの偉大な仕事をしていません - しかし、私は私のワークフローの一部とのトラブル...私は、スクリプトを持っている"cabal-dev ghci"を非サンドボックス非グローバル(user?)パッケージで使用するにはどうすればよいですか?

scratch.hs、(前cabal-devを抱えています)試してみるとghciにロードされます。 scratch.hsの内容は、私が取り組んでいる機能に応じて時間とともに変化します。 scratch.hsはライブラリコードベースの一部ではなく、私が作業している間は私の個人的なスクラッチスペースです。

ここで、私のサンドボックスをロードしてghciセッションを取得するには、ちょうどcabal-dev ghciにしてからscratch.hsをロードしてください。問題はこれが私のユーザパッケージデータベースを除外しているということです(つまり設計上、賢明に)scratch.hsは私のライブラリのbuild-dependsにないパッケージからモジュールを参照している場合(それは結局のところライブラリの一部ではありません)パッケージが表示されていない、と私は、次のようなエラーが出る:

scripts/scratch.hs:8:8: 
    Could not find module `Data.Aeson.Generic': 
     It is a member of the hidden package `aeson-0.3.2.11'. 
     Perhaps you need to add `aeson' to the build-depends in your .cabal file. 
     Use -v to see a list of the files searched for. 
Failed, modules loaded: none. 
この場合には、 scratch.hsData.Aeson.Genericをインポートしたい、

しかしaesonマイライブラリのbuild-depends(かなり適切)ではありませんが、です私のユーザーパッケージデータベースにあります。

どうすればこの問題を回避できますか?私は、これらのカテゴリのいずれかで答えを想像することができますが、多分私が見逃しているカテゴリがあります。

  1. 方法(選択的)にはcabal-devによって作成されたサンドボックスと一緒に私のユーザーパッケージデータベースからパッケージを使用しています。 (たぶん私自身のcabal-dev ghciスタイルスクリプトを転がしていますか?)

  2. 問題がなくなるようにワークフローを改善する方法の提案。

私はちょうど世界的にパッケージをインストールすることができます知っているが、私は、このように私のグローバルパッケージデータベースを汚染するには消極的だ(とcabal-devが明示的にこれを阻止します)。

アドバイスをいただきありがとうございます。

+1

私は...あなたができますか:ghci内からセットパッケージ? (あるいは、オプションの名前があなたのパッケージデータベースを選ぶのは何ですか?) –

+0

*額を叩く* - なぜ私はそれを考えなかったのですか? はい、それは動作します - ありがとうございます。私はそれを '.ghci'に追加して、それが自動的に起こるようにすることさえできます。ありがとう、ダニエル! – gimboland

+1

おっと、嘘をついてください。いいえ、それは動作しません。私のプロジェクトのテストスイートがaesonを使うので、私の.cabalファイルで参照されていたので、サンドボックスに持ち込まれましたが、暗黙のうちに 'cabal-dev ghci'によって読み込まれました。そのため私は '' set -package aeson''をロードする必要がありました。私がそれを削除した場合、実際には:set -package aeson'はユーザパッケージデータベースのバージョンをロードしません( ''パッケージには満足できません '')ので、私はどこから始めたのですか?このページは過去3時間で問題が解決したと考えています)。 – gimboland

答えて

8

私は、最も簡単な解決策は、必要なものをサンドボックスにインストールすることだと思います。あなたは対話型のスクリプトのアイソーン必要がある場合たとえば、:

~/myproject$ cabal-dev install aeson 
~/myproject$ cabal-dev ghci 

を次に:set -package aesonghciで動作するはずです。

これが不十分な場合、ユーザーパッケージデータベースから多くの依存関係を使用する必要があります。ghcを呼び出すために、キャブファイルが設定する他のフラグを使用してghciを呼び出す必要はありません。非サンドボックス化されたghciを呼び出すと、サンドボックスからのパッケージ、およびユーザーパッケージとグローバルパッケージにアクセスできます。例えば、(GHC 7.0.3用):

~/myproject$ GHC_PACKAGE_PATH=./cabal-dev/packages-7.0.3: ghci 

GHC_PACKAGE_PATHの終了時に結腸およびそのghciとの間の空間の両方に注意してください。)

+0

恐ろしい - 多くのありがとう。 2番目の提案は私のために働いています。 :-) (サンドボックスとユーザーに同じパッケージがインストールされているとどうなるのでしょうか?) 最初の提案も良く見えますが、現時点では実現できません。 '' ghci'で使われないようにする '' double-conversion'( 'aeson'の依存関係である' 'blaze-textual'の依存関係)です。回避策はありますが[cabal-devでは動作しません](https://github.com/mailrank/blaze-textual/issues/4)ので、私のサンドボックスに 'aeson'をインストールすることはできません現時点では。 – gimboland

+0

キャバル1.18のサンドボックス機能も少し変更されています: 'GHC_PACKAGE_PATH = .cabal-sandbox/x86_64-linux-ghc-7.4.1-packages.conf.d:ghci' –

関連する問題