ハッカソンに行って来てllenvをリニューアルしました

丁度週末やることないなーと思ってたら、@karupanerura さんに誘われて 1 泊 2 日で群馬水上までいってハッカソンしてきました!僕は丁度この数日でやってた llenv のリニューアル作業をしてきました。最後に発表した資料はこちらです。

App::llenv 2012/01 発火村 from Ryosuke IWANAGA

App::llenv とは?

年末に思いついて一気に shell script だけで書き上げた記事がこちらです。

まぁやりたいことの大体は実現できたんですが、細かい修正も大幅な修正も shell script は柔軟性がないのでやりづらいなぁと思って、perlbrew の様に perl で書いて App::FatPacker を使って必要な CPAN モジュールを 1 枚の perl script に詰め込むやり方にしようと思いました。perl ならほぼどんなディストリビューションにも入ってるのでいい感じです。というわけで github を新たに作りました。

ばっくりした簡単な説明は冒頭のスライドを見て頂ければと思います。以下、スライドをもうちょっと説明していきます。

何がしたいの?

主に 4 つです。

  • 好きな LL の好きなバージョンと好きなモジュール使って、アプリとかツールをサクサク開発して本番で使いたい
  • それを 1 つのディレクトリを rsync するだけで色んなサーバで使いたい
  • 他にも fluentd や supervisor の様に LL を使う便利ツールを簡単に使い始めたい
  • でも出来る限り既存の環境に影響与えたくないし相互に影響したくない

どういう構成なの?

これらを満たすために、以下の設計をしました。

  • LL 自身は OS の種類毎のディレクトリ配下に build してインストール
  • local::lib の様な形でアプリ毎のディレクトリ配下に外部モジュールをインストール
  • アプリディレクトリに設定ファイルを置いて、LL のバージョンやモジュールのディレクトリを指定
  • 適当なラッパーを使うと、そのプロセスの環境変数に適切にサーチパスを設定して、設定された LL をフルパスで実行する
  • さらにそれを書き込んだ shell script を PATH の通ったところに置いてどこでも使える様にする

どうやって使うの?

インストールは perlbrew をパクって以下の様な感じです。

$ curl -kL https://raw.github.com/riywo/App-llenv/master/llenv-install | bash

今はすごい汚い shell script ですが、これで$HOME/llenvというディレクトリに App::llenv が入ります。後は以下の bashrc 等に設定。

export LLENV_ROOT=$HOME/llenv
export LLENV_OSTYPE=`$LLENV_ROOT/bin/ostype`
export PATH=$LLENV_ROOT/bin:$PATH

大体見ての通りですが、LLENV_OSTYPEというのが LL 自身を OS の種類毎に出し分けるための環境変数です。ostypeコマンドは同梱されている超単純な shell script です。色んな環境でちゃんと動くかは試してません。。。

これでllenvコマンドとllinstallコマンドが使える様になります。

まず、llinstallで LL を入れます。このコマンドは今回のハッカソンの成果ですが、たいしたことはやってなくて、とっても無理やり perlbrew や nvm なんかを統一的に扱うインタフェースにしてます。

$ llinstall init perl
$ llinstall install perl perl-5.14.2
$ llinstall list perl
$ llinstall exec perl perl-5.14.2 -- -V

init で perlbrew をインストール、install で perl をインストール、list でディレクトリ一覧、exec でその perl を実行できます。まだやってないんですが、多分この作業が OS の種類毎に必要になります。それを deploy サーバとかに配置してあげれば全サーバに撒いて終わりかなと思います。

無事 LL がインストールできたら、それを使って llenv を構築します。

$ llenv setup MyApp -l perl -v perl-5.14.2
$ cd ~/llenv/apps/MyApp
$ llenv exec perl -- -V
$ llenv exec hoge.pl
$ llenv exec plackup -- app.psgi
$ llenv install hoge.pl
$ hoge.pl

setup で LL の種類とバージョンを指定すると apps ディレクトリ下にディレクトリと.llenv.plという設定ファイルができます。あとはそのディレクトリに移動してからllenv execで実行すると、環境変数込みで指定したバージョンの LL が利用できます(llinstallで LL がインストールできている前提)。もしバージョン指定しないと、単にperlと記述されるので、env perlな感じにもできるので、一応llinstallと切り離して使うこともできなくはないと思います。

最後にできあがったスクリプトや、外部モジュールでインストールされるスクリプト(例えばplackup)を PATH の通った所に配置するのが install です。実態は以下の通りです。

$ cat ~/llenv/bin/hoge.pl
#!/bin/sh
export PERL5OPT="-Mlib=$LLENV_ROOT/apps/MyApp/local/lib/perl5 -Mlib=$LLENV_ROOT/MyApp/perl/lib $PERL5OPT"
export PATH="$LLENV_ROOT/MyApp/perl/bin:$LLENV_ROOT/apps/MyApp/local/bin:$PATH"
exec $LLENV_ROOT/lls/$LLENV_OSTYPE/perl/perls/perl-5.14.2/bin/perl $LLENV_ROOT/apps/MyApp/bin/hoge.pl "$@"

cpanm とか carton 周りはちょっとハックが必要なのですが、めんどうなので今回は説明はパスします。。。

今の作業が、perl に限らず ruby/python/node でできるようにしています。ちょっとまだハードコードあったりいい加減な部分多いのは僕が perl 以外ほとんど知らないからですごめんなさい。。。

今後は?

まだとりあえず作って見たレベルなので、ユーザビリティを上げたり、各 LL でちゃんと動くように、そしてコレ使って開発して本番で使っていきたいと思っています。実際、今 App::llenv 自体を llenv 使って開発しています(ややこしい。。。)

ハッカソンについて

というわけで、自分としては今までにないぐらい集中して開発できました。一人で土日使ってもここまではできなかったと思います。みんなで頭突き合わせて作業すると思ってたより捗りますね。途中と最後で発表があるのでそれを区切りにして進められたもよかったですね。

僕はこんなしょぼい perl 書くのでせいいっぱいでしたが、他の参加者のみなさんは非常に高級なことをしていてすごかったです。sugyan さんが emacs の設定を披露してましたが、なんかそろそろ僕も開発環境整えてみたいなぁと思いました。今回の開発も素の vim で頑張った感じです。

なお、今回の旅行中に kan さんに誘われてモゲマスを始めました。アイドル達かわいいですね。あと、タオル忘れてしまったのですが gfx 先生に余分を貸して頂きました。この御恩はタオル 10 倍にして返します。あと、karupanerura さんが早速つぎゃってくれましたので、つぶやきの様子はこちらで!

というわけで、今回のハッカソンをマネージしてくれた@kfly8 さんはじめ、参加者のみなさん楽しい 2 日間をありがとうございました!またやりましょう!!