システムPerlを無理矢理別バージョンにする

| | トラックバック(0)

カテゴリ:

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で入れていきましょう。)

トラックバック(0)

このブログ記事を参照しているブログ一覧: システムPerlを無理矢理別バージョンにする

このブログ記事に対するトラックバックURL: https://nozawashinichi.sakura.ne.jp/MT-4.25/mt-tb.cgi/1197

comments powered by Disqus

このブログ記事について

このページは、Shinichi Nozawaが2014年4月 1日 12:51に書いたブログ記事です。

ひとつ前のブログ記事は「Mac LeopardのシステムPerlから5.16へ切り替えてシステムApacheに認識させる」です。

次のブログ記事は「Mojoliciousはじめられた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。