Hackage2によるインハウスパッケージサーバを試す

この記事は Haskell Advent Calendar 2012 15日目の記事です.


みんな何かヨサゲなもの作ったら hackage に upload してシアワセおすそわけしてると思う.ああ,すばらしきこのせかい.ユウジョウ!

が,たとえば,オシゴトとかでソースをオープンにせずに Haskell で何か作りたい,けど cabal install で開発者がみんなそれぞれ利用できる状態にしておきたい…って状況出てくるんじゃないかなーと思う.こんな世知辛〜いケースでは当然 hackage を使うわけにはいかない.ヤンナルネ.どうにかしてあげなければならない.具体的には maven2 の inhouse repository のようなもの,つまり inhouse hackage server が必要だ.

yackageこのエントリ にもある通りそんな役割を持っている.しかし, yackage は開発中のものを hackage への upload した後の状況をテストするために必要な機能しか持っていない.例えば,ユーザアカウントや,それに伴う権限管理が無かったりする.

なので,試しに hackage2 を使ってみよう.公式にビルド方法が書いてあるが,実際にやってみるとエラー踏むことがあったので,その解決も含め立ち上げ作業は以下のような感じになった.ちなみに私は余程コアなパッケージ以外には cabal-dev を使う.(コアなパッケージはportageで)

$ darcs get http://code.haskell.org/hackage-server/
$ cd hackage-server
$ cabal-dev install --only-dependencies
$ cabal-dev configure -O0
cabal: The program alex version ==2.2.* || ==2.3.* is required but the version
found at /usr/bin/alex is version 3.0.2
$ cabal-dev install alex-2.3.5
dist/build/alex/alex-tmp/Scan.hs:344:17:
    Illegal bang-pattern (use -XBangPatterns):
    ! (base)
Failed to install alex-2.3.5
cabal: Error: some packages failed to install:
alex-2.3.5 failed during the building phase. The exception was:
ExitFailure 1
$ cabal-dev install alex-2.3.5 --ghc-options=-XBangPatterns
$ export PATH=$(pwd)/cabal-dev/bin:$PATH
$ cabal-dev configure -O0 --constraint='alex ==2.3.5'
$ cabal-dev build
$ ./dist/build/hackage-server/hackage-server init --static-dir=static/ --admin=notogawa:********
$ ./dist/build/hackage-server/hackage-server run --static-dir=static/

さて,これで準備は整った.デフォルトだと http://localhost:8080/ でアクセスできる.

hackage2 ではユーザアカウントがあり,さらに各アカウントに対しhackage2に対する操作権限管理が設定できる. http://localhost:8080/admin.html から uploader のリンクを辿ると,どのユーザがこのhackage2に対するアップロード権限を持ってるかをコントロールできる.また,一度 upload したパッケージに対しては,パッケージ毎に maintainer を設定することができる.リリースマネジメント担当者など登録しておくのがよいだろう.

hackage のミラーなどもできるようだ.今回は目的外なので試してはいない.

各ユーザがこのローカルに立てた hackage2 を参照するには, cabal config ファイルに以下のように remote-repo を追加して,

 remote-repo: hackage.haskell.org:http://hackage.haskell.org/packages/archive
+remote-repo: localhost:http://localhost:8080/packages/archive
 remote-repo-cache: /home/user/.cabal/packages

update すればよい,

$ cabal update

これでもうローカルに upload したパッケージを cabal install できるようになっている.

さて,この状態でチョイと気になるのは cabal upload したらどうなるの?というところではないだろうか? config に remote-repo が2つ書かれているところから,公式に上がるのか,それともローカルに上がるのか….オープンにしない目的でローカルを立てたのにウッカリ公式のほうに上がってしまったりしたらインシデントである.

で,いきなり結果だが.どうも現状 cabal upload のターゲットは後に書いた方のremote-repoのようだ.しかも, hackage2 のアップロード用URLにささっておらず,いずれにせよ cabal upload だと hackage2 へは アップロードできない.とりあえずのところ安心だ.とは言うものの,今後 hackage2 の開発が進んで何がどうなるかわからないので,このような環境ではWebフォームからのアップロードが安全ではあると思う.

このへんプロダクト開発において組織的に Haskell 使うようになると必要になってくるんじゃないかなー?と想像して今回のネタになったわけだが,現実として Haskell でプロダクト開発しているところでは実際のところどうなのだろうか?「えぇ!そんな目的だったら実にはコレコレこういう方法のほうがいいんデスヨ!」みたいなミミヨリ話があったら是非教えて欲しい.