cabalコマンドでパッケージを手軽にインストール

 これまでの回で何度も触れてきたように,GHCなどのHaskell処理系では,パッケージを作成・インストールするための基盤として「Cabalパッケージ」が提供されています。

$ ghc-pkg list Cabal
C:/Program Files/Haskell Platform/2010.1.0.0\lib\package.conf.d:
    Cabal-1.8.0.2

 Haskell Platformでは,Cabalパッケージに加え,Cabalパッケージをコマンドライン・プロンプト上で使用するためのフロントエンドである「cabalコマンド」が提供されています。cabalコマンドは,バックエンドのライブラリであるCabalパッケージと区別するため,cabalコマンドのパッケージ名であるcabal-installと呼ばれることもあります。この記事ではこれ以降,単にcabalと書くときにはcabalコマンドを指し,ライブラリを指す場合は必ずCabalパッケージと表記することで,両者を区別することにします。

 cabalコマンドを使ったパッケージのインストールは,Cabalパッケージを利用してパッケージをインストールするという第2回のコラムで紹介した方法に比べ,いくつかの点が便利になっています。

 第一に,cabalのinstallコマンドでは,configure,build,installの三つのコマンドを一括して実行できます。

$ cabal install
Resolving dependencies...
Configuring monads-tf-0.0.0.1...
Preprocessing library monads-tf-0.0.0.1...
~ 略 ~
Building monads-tf-0.0.0.1...
Registering monads-tf-0.0.0.1...
Installing library in C:\Documents and Settings\shelarcy\Application
Data\cabal\monads-tf-0.0.0.1\ghc-6.12.1
Registering monads-tf-0.0.0.1...

 これらのコマンドは別々に実行できたほうがいい場合もあります。このため,cabalでもconfigureコマンドとbuildコマンドが用意されています。

$ cabal --help
~ 略 ~

Commands:
  install      Installs a list of packages.
~ 略 ~
  configure    Prepare to build the package.
  build        Make this package ready for installation.
~ 略 ~

 第二に,cabalではファイルを指定する必要がありません。Cabalパッケージはライブラリなので,main変数を持ったSetup.hsやSetup.lhsを指定して実行する必要がありました。

 第三に,cabalのinstallコマンドは,HackageDBからのパッケージの取得や依存関係の解決を自動的に行ってくれます。例えばcabal installを使ってHackageDBにあるmonads-tfパッケージを取得してインストールする場合,monads-tfパッケージに必要なtransformersパッケージも自動的に取得・インストールしてくれます。

$ cabal install monads-tf
Resolving dependencies...
Downloading transformers-0.1.4.0...
Configuring transformers-0.1.4.0...
Preprocessing library transformers-0.1.4.0...
Building transformers-0.1.4.0...
~ 略 ~
Registering transformers-0.1.4.0...
Installing library in C:\Documents and Settings\shelarcy\Application
Data\cabal\transformers-0.1.4.0\ghc-6.12.1
Registering transformers-0.1.4.0...
Downloading monads-tf-0.0.0.1...
Configuring monads-tf-0.0.0.1...
Preprocessing library monads-tf-0.0.0.1...
Building monads-tf-0.0.0.1...
[ 1 of 19] Compiling Control.Monad.Writer.Class ( Control\Monad\Writer\Class.hs,
 dist\build\Control\Monad\Writer\Class.o )
~ 略 ~
Registering monads-tf-0.0.0.1...
Installing library in C:\Documents and Settings\shelarcy\Application
Data\cabal\monads-tf-0.0.0.1\ghc-6.12.1
Registering monads-tf-0.0.0.1...

 --dry-runオプションを使えば,installコマンドによりインストールされるパッケージ一覧の情報を,インストールすることなく取得できます。

$ cabal install monads-tf --dry-run
Resolving dependencies...
In order, the following would be installed (use -v for more details):
transformers-0.1.4.0
monads-tf-0.0.0.1

 パッケージ名の後にバージョン番号を付けることで,指定したバージョンのパッケージをインストールすることもできます。

$ cabal install monads-tf-0.0.0.0
Resolving dependencies...
Downloading monads-tf-0.0.0.0...
Configuring monads-tf-0.0.0.0...
Preprocessing library monads-tf-0.0.0.0...
Building monads-tf-0.0.0.0...
~ 略 ~
Registering monads-tf-0.0.0.0...

Installing library in C:\Documents and Settings\shelarcy\Application
Data\cabal\monads-tf-0.0.0.1\ghc-6.12.1
Registering monads-tf-0.0.0.0...

 ただし,HackageDBから取得できるのは,「cabalが情報を持っているパッケージ」の中の「cabalが情報を持っているバージョン」だけです。

$ cabal install hood
cabal: There is no package named hood. Perhaps you need to run 'cabal update' first?

$ cabal install vector-0.5
Resolving dependencies...
cabal: There is no available version of vector that satisfies ==0.5

 cabalがパッケージに関する情報を持っていなかったり,cabalが持つパッケージ情報が古かったりする場合,あらかじめcabalのupdateコマンドを使って情報を更新しておく必要があります。

$ cabal update
Downloading the latest package list from hackage.haskell.org

 なお,cabalコマンドを使ったパッケージのインストールは,ユーザーごとのローカル環境が対象になります。

 WindowsではユーザーのApplication Dataディレクトリにファイルがインストールされ,ユーザーのApplication Dataディレクトリにあるユーザーごとのパッケージ・データベース(package.conf.dファイル)にパッケージ情報が追加されます。

$ cabal install
~ 略 ~
Installing library in C:\Documents and Settings\shelarcy\Application
Data\cabal\monads-tf-0.0.0.1\ghc-6.12.1
Registering monads-tf-0.0.0.1...

$ ghc-pkg list
C:/Program Files/Haskell Platform/2010.1.0.0\lib\package.conf.d:
    Cabal-1.8.0.2
    ~ 略 ~

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

 Mac OS XなどのUnix環境でも,ユーザー・ディレクトリにファイルがインストールされ,ユーザー・ディレクトリにあるユーザーごとのパッケージ・データベースにパッケージ情報が追加されます。

$ cabal install
~ 略 ~
Installing library in /Users/shelarcy/.cabal/lib/monads-tf-0.0.0.1/ghc-6.12.1
Registering monads-tf-0.0.0.1...

$ ghc-pkg list
/Library/Frameworks/GHC.framework/Versions/612/usr/lib/ghc-6.12.1/package.conf.d
    Cabal-1.8.0.2
    ~ 略 ~
/Users/shelarcy/.ghc/i386-darwin-6.12.1/package.conf.d
    monads-tf-0.0.0.1
    transformers-0.1.4.0

 これは,--userオプション付きでインストールする場合と同じ動作です(参考リンク)。つまり,オプションを省略した場合は--userオプションを付けたと見なされます。ユーザーごとの環境ではなく,グローバルな環境にインストールしたい場合には,--globalオプション付きでインストールします。