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 日くらいで書き上げたツールなのでまだまだいい加減なツールですが、これからブラッシュアップしていこうと思います。

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