パッケージの削除方法

 cabalには,パッケージを削除するための機能は今のところ用意されていません。インストールしたパッケージをGHCから削除したい場合には,まずghc-pkgのunregisterコマンドを使用してパッケージ・データベースから情報を消去する必要があります(参考リンク)。

$ ghc-pkg list
    ~ 略 ~

C:\Documents and Settings\shelarcy\Application Data\ghc\i386-mingw32-6.12.1\pack
age.conf.d:
    monads-tf-0.0.0.1
    transformers-0.1.4.0

$ ghc-pkg unregister monads-tf

$ ghc-pkg list
    ~ 略 ~

C:\Documents and Settings\shelarcy\Application Data\ghc\i386-mingw32-6.12.1\pack
age.conf.d:
    transformers-0.1.4.0

 unregisterコマンドを使うことで,パッケージ・データベースからmonads-tfパッケージの情報が削除されたことがわかります。

 unregisterコマンドを使って,他のパッケージが利用するパッケージを先に削除しようとした場合には,ghc-pkgは以下のようなエラー・メッセージを出力します。

$ ghc-pkg unregister transformers
ghc-pkg: unregistering transformers would break the following packages: monads-t
f-0.0.0.1 (use --force to override)

 メッセージにあるように,--forceオプションを指定すれば,他で利用するパッケージを先に削除することもできます。

$ ghc-pkg unregister transformers --force
unregistering transformers would break the following packages: monads-tf-0.0.0.1
 (ignoring)

 しかし,--forceを使って無理にパッケージを削除すると,そのパッケージを利用する他のパッケージが壊れてしまいます。複数のパッケージを削除する必要があるのでない限り,無理にパッケージを削除するのはやめましょう。

 壊れたパッケージは,ghc-pkgのlistコマンドを使うと,以下のように{ }で囲まれた形で表示されます。

$ ghc-pkg list
WARNING: there are broken packages.  Run 'ghc-pkg check' for more details.
C:/Program Files/Haskell Platform/2010.1.0.0\lib\package.conf.d:
    ~ 略 ~

C:\Documents and Settings\shelarcy\Application Data\ghc\i386-mingw32-6.12.1\pack
age.conf.d:
    {monads-tf-0.0.0.1}

 壊れたパッケージがある場合には,警告メッセージにあるように,ghc-pkgのcheckコマンドを使って壊れた原因を探ることができます(参考リンク)。

$ ghc-pkg check
There are problems in package monads-tf-0.0.0.1:
  dependency "transformers-0.1.4.0-cf8beea8fe76efd8174de1d20be06e27" doesn't exi
st

The following packages are broken, either because they have a problem
listed above, or because they depend on a broken package.
monads-tf-0.0.0.1

 「transformers-0.1.4.0という依存パッケージがないため,monads-tf-0.0.0.1が壊れた」という情報が表示されています。

 なお,ghc-pkgのunregisterコマンドが行うのは,あくまでパッケージ・データベースに対する操作だけです。インストールされたファイルを削除したい場合には,OSのコマンドなどを使って別途削除する必要があります。OSによるファイルの削除は,Haskellのパッケージに限定されているわけではないので,危険を伴います。将来的には,cabalが削除処理を含むパッケージ管理全般を行うようになってほしいと思います。