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オプション付きでインストールします。