CabalによるHackageへのアップロードとSetup.hsの使い方

CabalでHackageにパッケージを上げたのでやり方をまとめておきます。

0.Hackageのアカウントを用意する

Hackageはダウンロードなら誰にでも出来るようになっていますが、アップロードするにはアカウントが必要になります。説明を読んで、ross@soi.city.ac.ukに(英語で)ユーザ名と初期パスワードをもらいましょう。

1.cabalファイルとSetup.hsの生成

次に、cabalコマンドを使って必要なファイルを.tar.gz形式のパッケージにまとめます。まずはアップロードしたいプロジェクトのディレクトリ内で

$ cabal init

をすると、パッケージ名や作者名を対話的に設定してくれます。この設定ファイルはプロジェクト名.cabalという名前で保存されますが、同時にSetup.hsというHaskellコードも生成されます。これはプロジェクトをビルドするために使うものです。

2.cabalファイルの修正

.cabalファイルは自動的に生成されますが、ほとんどの場合はここから手動で手直しをする必要があると思います。runhaskellコマンドを下のように進めていって順に問題点を洗い出しましょう。

$ runhaskell Setup.hs configure
$ runhaskell Setup.hs build
$ runhaskell Setup.hs install

この時によく使いそうな.cabalの項目は

  • description: パッケージの詳しい説明
  • extra-source-files: 追加のソースコード
  • data-files: 画像などの添付データ
  • build-depends: 依存しているパッケージ
  • ghc-options: GHCに与えるオプション

の辺りかと思います。

詳しい.cabalとSetup.hsのドキュメントはUser's Guideにあります。詰まったときにはFAQも参考になります。

3.パッケージのチェックとアーカイブ

パッケージが無事ビルドできるようになったら、最後のチェックをします。

$ cabal check

これでパッケージの設定におかしなところがないかをチェックしてくれます。この作業はHackageのウェブサイトでも登録なしに可能です。

チェックが済んだらパッケージを.tar.gzにまとめます。

$ runhaskell Setup.hs sdist

これでdistディレクトリに完成したパッケージが出来るはずです。

4.パッケージのアップロード

最後にパッケージのアップロードです。

$ cabal upload パッケージ.tar.gz

ユーザ名とパスワードを求められるので、それを入力すればアップロード完了です。この作業もウェブサイトで出来ますが、なぜかcabalを使った方がかなり速いようです。

アップロードが終われば自分のパッケージをcabalからインストールできるようになっているはずです。

$ cabal update
$ cabal install パッケージ名

補足

cabalによるインストール時にはビルドしたバイナリとデータフォルダが別の位置に置かれるため、データフォルダのある場所からバイナリを起動する必要があるようです。
http://haskell.g.hatena.ne.jp/horaguchi/20080922/1222087909

また、それでは困るという場合にはこの辺りが参考になりそうです。
Accessing data files from package code