LLをお手軽に使うllenvというのを作りました

perlbrew+cartonとかとっても便利なんですが、例えばそれで作ったCLIツールとかにパスだけ通しても、carton execするためにcdしなきゃだったりなんだかんだめんどくさいなーと思って、ライブラリのパスを環境変数で渡して、実行するperlをフルパスで指定してあげる感じにしたらいいかもと思いました。

よく考えるとrubyでもおんなじ感じでできるなーと思って、じゃあpythonとかnode.jsもいんじゃね?ということで色々それぞれの言語の使い方調べて、ある程度統一的に使える様にしてみたのでひとまず公開しました。

使い方

例えば、今使ってるperlのsite_perlには何も入れたくないけど、ikachanを使いたいとします。まずikachan用のディレクトリを作ります。

$ llenv setup perl perl-5.14.2 ikachan

これで~/.llenv/apps/ikachanというディレクトリができて、その中に.llenvというファイルができます。

$ cat ~/.llenv/apps/ikachan/.llenv
export LLENV_LL=perl
export LLENV_LLPATH='$PERLBREW_ROOT/perls/perl-5.14.2/bin/perl'
export LLENV_BUNDLELIBPATH='$LLENV_APPDIR/ikachan/local/lib/perl5'
export LLENV_BUNDLEPATH='$LLENV_APPDIR/ikachan/local/bin'

ikachanディレクトリにikachan入れましょう。cpanm -l extlibで入れた場合は、上記のLLENV_BUNDLELIBPATHとかのlocalの部分を書き換えて下さい。

$ cd ~/.llenv/apps/ikachan
$ carton install App::Ikachan

当然ですが、このままではPATHも通っていないので実行できません。

$ ikachan
-bash: ikachan: command not found

そこでllenvで実行してみます。

$ cd ~/.llenv/apps/ikachan
$ llenv exec ikachan
Missing mandatory parameter: irc_server at /home/riywo/.llenv/apps/ikachan/local/bin/ikachan line 38.

実行できましたね!でも、これだとcartonと同じでcdしないとダメなので、どこでも実行できるようにPATHの通っている~/.llenv/binに入れましょう

$ llenv install ikachan
$ which ikachan
~/.llenv/bin/ikachan
$ ikachan
Missing mandatory parameter: irc_server at /home/riywo/.llenv/apps/ikachan/local/bin/ikachan line 38.

うまくいきました!どうなってるかというと、

$ cat ~/.llenv/bin/ikachan
#!/bin/sh
export PERL5OPT="-Mlib=$LLENV_APPDIR/ikachan/lib"
export LLENV_LLPATH="$PERLBREW_ROOT/perls/perl-5.14.2/bin/perl"
export LLENV_SCRIPT_PATH="$LLENV_APPDIR/ikachan/local/bin/ikachan"
exec $LLENV_LLPATH $LLENV_SCRIPT_PATH "$@"

という感じで、単純なshell scriptが実体です。

これはperlの例ですが、ruby/python/nodeでも多分なんとなく動きます。

$ llenv setup node v0.6.5 coffee
$ cd ~/.llenv/apps/coffee
$ npm install coffee
$ llenv install coffee
$ coffee

もちろん、こういうツールをインストールするためだけのツールじゃなくて、appsに自分で作ったいろんなツールもおんなじ様にイケルと思います。

アイデアは半年くらい温めていて、12/29になんとなくやろうと思いついて1日くらいで書き上げたツールなのでまだまだいい加減なツールですが、これからブラッシュアップしていこうと思います。

細かい仕組みの解説とかはまた今度!