2011-11-01 12 views
34

ghc-pkg checkは壊れたパッケージを表示し、なぜそれらが壊れているのかというよりは良いことです。しかし、私が知る限りでは、壊れたパッケージを自動的に処理する方法はありません。壊れたパッケージを扱うための推奨される方法は何ですか? (GHCを再インストールしないことをお勧めします)ghc-pkg checkで指摘されている問題を修正しました。

+0

これはパッケージのインストール方法によって異なります... – ivanm

答えて

29

あなたは、グローバルパッケージデータベースを破壊しないほど賢明でした。破損は、簡単にGHCの再インストールが必要であることを意味します。だから、破損がユーザーパッケージdbに制限されていると仮定しよう。唯一のいくつかのパッケージが壊れている場合、あなたは、問題のあるパッケージの登録を解除することで、多くの場合、ボルケンの登録を解除すると、他のパッケージを破るだろうと文句を言うだろう

$ ghc-pkg unregister --user borken 

をセットアップを修正することができます。最初に登録を解除するか、またはすぐに--forceでボルケンを登録解除しようとするかどうかは、後で新たに壊れたものを扱うかどうかは、ほとんどの選択肢です。 ユーザdbのパッケージのみを登録解除するようにしてください。物事があまりにも厳しくない場合は、少数のパッケージの登録を解除した後に、ghc-pkg checkはもはや壊れたパッケージを報告しません。
一方、パッケージの大部分が壊れている場合、他のOSのユーザデータベース$ rm -rf ~/.ghc/ghc-version/package.conf.dまたは同等のものを完全に消去する方が簡単かもしれません。

いずれにせよ、あなたはまだ使いたいパッケージを失ってしまいますので、新しいものを壊すことなく再インストールしようとします。あなたはcabal-installにインストールされたすべてのパッケージの一貫性のインストール計画を作成しようとします

$ cabal install world --dry-run 

を実行します。それができない場合は、理由が表示されますので、ワールドファイル(~/.cabal/world)に記載されているパッケージに制約を加えることで問題を解決することができます。 ghc/ghc-pkg)、cabal install world --dry-runは、vector >= 0.6 && < 0.8(私はvector-0.7.1がインストールされています)に依存するvector-algorithms-0.5.2を設定できないと教えてくれました。理由は、hmatrix-0.12.0.1にはvector >= 0.8が必要なためです。 hmatrixの-any「制約」をワールドファイルの「< 0.12」に置き換えると、クリーンインストールプランが作成されました。
したがって、ワールドファイルに制約を払った後、Cabalからインストールプランを入手します。そのパッケージが既にインストールされているパッケージを再インストールするかどうかを確認してください(新しいバージョンをインストールすると大丈夫ですが、同じバージョンを再インストールするとトラブルが発生します)。キャバルの設置計画に満足している場合は、cabal install worldとGHCが忙しい間にお茶の素敵な鍋を醸造してください。もう一度ghc-pkg checkを実行し、すべてが正しいことを確認します。

一般的に良いアドバイス:パッケージのインストール内容がわからない場合は、は常に--dry-runを最初に使用します。

カバールでグローバルインストールを行うと、犯罪者の登録を解除する戦略が有効になることがありますが、どのように壊れているかによって、ghcが破損する可能性があります。あなたのOSディストリビューションからパッケージをインストールしてグローバルDBを壊した場合は、新しいGHCをインストールし、ディストリビューターを呪い、それ以上のイベントを防ぐのを助けてください。

cabal repairコマンドは非常に便利ですが、当面は壊れた設定を修復することは残念ながらはるかに多くの作業です。

+0

グローバルパッケージデータベースが壊れているのは何ですか?パッケージをシステム全体でインストールする場合(パッケージマネージャーのためか、複数のマシン用にマシンを管理しているためにパッケージをグローバルにインストールしているため)、修正するだけです。ブートパッケージが壊れたときには**問題です** – ivanm

+0

はい、ブートパッケージが影響を受けていない場合、大きな違いはありません。ユーザーデータベースを完全に消去して、もう一度動作中のGHCを持つことができます。しかし、残念なことにブートパッケージがかなりの影響を受けるという印象を受けました。グローバルにインストールする場合は、特に注意してください。 –

+0

cabal-installを使用すると、ブートパッケージが影響を受ける可能性がありますが、ディストリビューションマネージャを使用しても問題ありません。 – ivanm

15

しばらくの間、私はこれに頼っていましたghc-pkg-clean script。破損したパッケージはすべて削除され、必要に応じて再インストールされます。より深刻な破損については、ghc-pkg-reset scriptを使用します。

今日、私はghc-pkg-autofixを発見しました。これは、この壊れたパッケージを自動化して、破損しないようにしています。私はそれが何をしているのかわかりません、YMMV。

+4

説明とソースを少し見れば、 'ghc-pkg-autofix'は'〜/ .ghc /.../ package.conf.d/package'の依存関係情報を書き換えます。それは危険な操作であり、物事を暗黙のうちに壊すかもしれませんが、それがうまくいくと、速くなります。 descrisが言うように、_あなた自身のリスクで使用する_。スクリプトがより安全に見えます。しかし、あなたが私のようで、複数のGHCがインストールされている場合、ghc-pkg-cleanは、ghcにリンクされているものだけを処理します(ghc-pkgが使用する引数を取るスクリプトを簡単に変更できます)およびghc-pkg-resetそれらをすべて傷つけるだろう。だから、私のためではなく、私は変だ。 +1の自動ヘルプ。 –

関連する問題