MacにデフォルトでインストールされているPerlとApacheで会社のサービスをホストしています。
構成
- MacBook
- Mac OS X Leopard 10.5
- システムPerl 5.8
- Apache 2
Perlが5.8なので、Mojoliciousが使えなかった。( 5.10.1以上必須) それに、もっと上のバージョンのPerlが持っている機能(sayとか)使いたかった。
でも、なかなかPerlのバージョンを上げることができなかった。
やりたいこと
- 既存のCGI (Perl) はそのまま動いていてほしい
- CGIなのでApacheはスクリプトのシバン行( #!/usr/bin/perl )を読む
- シバン業の書き換えはしたくない
- モジュールの移行は手動じゃなく機械的にやりたい
plenvで別バージョンのPerlを入れてもApacheは認識してくれない
plenv global 5.16.1
plenv local 5.16.1
とやれば、自分が使うPerlは全部5.16.1にできますが、Apacheはそちらを使ってくれません。
というのはあたりまえで、シバン行で /usr/bin/perl と指定してしまっているからです。
シバン行を
/usr/bin/env perl
と書き換えてみましたが、やはり認識してくれませんでした。これはplenvが悪いのではなく、Apacheが起動するときのbashの設定を変えてpathを書き換えてやらなければだめだからだと思うのですが、わかりませんでした。
シンボリックリンクを使って /usr/bin/perl を別のところに飛ばす
そこで、これはかなり荒業だと思うのですが、シンボリックリンク(あるいはハードリンクでもいいのかな?)を使って、 /usr/bin/perl とアクセスしても別に飛ばしてしまう方法を考えました。
cd /usr/bin
sudo mv perl perl_original
既存の /usr/bin/perl は 別名で移動しておきます。
そして、シンボリックリンクを作ります。
sudo ln -s /Users/[username]/.plenv/build/perl-5.16.1/perl perl
lnはリンクを作るコマンドで、 -s オプションは シンボリックリンク(ハードリンクではない)という意味です。そして a -> b に飛ばす場合 b a の順で書きます。
plenvのperlのバスはshim以下の方ではダメです。
OK /Users/[username]/.plenv/build/perl-5.16.1/perl
NG /Users/[username]/.plenv/shim/perl5.16.1
shim以下のほうはシェルスクリプトになります。
これで、CGIのシバン行は /usr/bin/perl のままで、Apacheの設定は何も変えずに、使用するPerlのバージョンを切り替えることができました。
モジュールの移行は cpanm (CPAN minus) を積極的に使おう
これだけだと、既存環境のPerlに入っていたモジュールが新しい方には入っていなくてエラーの嵐に鳴ると思います。手作業でモジュールを移行するのはミスのもとなので、機械的に移行します。
plenvは cpanm を使うことを考慮して作られているので、
plenv install-cpanm
で cpanm をインストールできます。
これでcpanmコマンドが使えるので、あとは、cpanmにモジュールのリストを食わせてやれば移行できます!!!
モジュールの吐き出しはこちら]。(うまくいかない場合もあるので、これである程度インストールしたらあとは、手動で足りないものをcpanmで入れていきましょう。)