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

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

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日間をありがとうございました!またやりましょう!!