More about Shipwright

前回はてきとーなモジュールをShipwrightに突っ込んでインストールしてみる、というところまでやってみたけど実用的なことは何一つやってませんでした。というわけでCatalystおよびcatalyst.pl MyAppしてできたスケルトンをパッケージングしてテストサーバーを起動するとこまでやってみたよ。

パッケージはここにあります。
http://svn.onot.in/public/shipwright/catalyst-myapp/

インストール

Shipwrightパッケージはデフォルトでは/tmpの下にインストールされますが、これを/opt以下に変更します(よくわかってないけど気持ちの問題?)。Shipwrightのパッケージは/usrとか/usr/localとかの下にインストールするようなものではなく、このパッケージだけが存在するような状態にインストールするのが正しいようです。

$ mkdir /opt/catalyst-myapp
$ bin/shipwright-builder --install-base=/opt/catalyst-myapp

テストサーバーを起動

$ /opt/catalyst-myapp/bin/myapp_server.pl

これでいつも通りポート3000でテストサーバーが起動します。

えっ、なんで?

どうなってんの?

/opt/catalyst-myapp/binを見るとわかりますが、すべて../etc/shipwright-script-wrapperへのシンボリックリンクになってます。shipwright-script-wrapperはシェルスクリプトで、PATHやPERL5LIBなど必要な環境変数を設定したうえでリンク元スクリプトを実行するようになっています。だからなーんもしなくてもテストサーバーが起動したのです。すごい!

シェルスクリプトとかには疎いのでこんな発想はまったくなく、ただすげえなーと思いましたよ。

で、tools以下にはshipwright-source-bashやshipwright-source-tcshというのもあって、.bashrcとかで以下のようにしておけばログインした直後にPATHやPERL5LIBがうまいこと設定された環境が手に入ります。

source /opt/catalyst-myapp/tools/shipwright-source-bash /opt/catalyst-myapp

そんなわけで

思ってたより全然使いやすい!

アプリを更新するときは別のパス(/opt/catalyst-myapp-0.2とか)にインストールしてApacheのconfで参照先を切り替えてrestartとかも簡単にできるのかな?

ただいいとこばかりではない

いまいちなところもいくつかあります。まあしょうがないよね、というようなことや、単に誤解してるだけの部分もあるかもしれないけど思ったことを以下に列挙してみる。

リビジョン番号が上がりまくる

やっぱshipwright importするときにリビジョンが上がりまくるのが気になる。そんなに頻繁にcommitしなくていいのに・・。

必要なモジュールがインポートされないこともある

たとえばTree::Simpleをインポートしたとき、build_requiresにTest::Exceptionが入ってるのにインポートされなかった。

インストール順(order.yml)はマニュアルで管理

デフォルトの順番だとうまくいかなかったのでトライアンドエラーで直したりしたよ。

http://trac.onot.in/public/changeset/512
http://trac.onot.in/public/changeset/519

パッケージング環境による差異

Makefile.PLやBuild.PLで条件判定をしてrequiresを決めているようなモジュールがあるとパッケージング環境によって依存モジュールがインポートされたりされなかったりする。

たとえばModule::SignatureのMakefile.PLには以下のようなコードがあり、環境によってDigest::SHAがインポートされたりされなかったりする。

# We will need something to handle SHA1/256
unless (
    can_use('Digest::SHA')  or
    can_use('Digest::SHA::PurePerl') or
    (can_use('Digest::SHA1') and can_use('Digest::SHA256'))
) {
# Nothing installed, we need to install a digest module
    if ( can_cc() ) {
        requires 'Digest::SHA';
    } else {
        requires 'Digest::SHA::PurePerl';
    }
}

いじょー。