- 2006-06-19 (月)
- Perl
先週公開した、じゃらんWebサービスを使ったサンプルサイト「シンプル宿検索」にて、perlのソースコードも一緒に公開してみたのですが、さっそく興味を持ってくれた方から問い合わせを頂きました。
cgiを実行させようとしたら以下のエラーが出てしまいました:
Can't locate Template.pm in @INC (中略) at search.cgi line 5 ...
Template.pm モジュールがインストールされてないよ!って怒られています。あー、コード公開する際は必要なCPANモジュールも一緒に添付しといてあげたほうが親切なのかな?いやでもそれ面倒くさいし無理あるなあ・・・。
Webでキーワード "CPAN" を検索すると出てくるCPANの使い方系ページの多くは、そのサーバの root 権限を持っている前提で、サーバの共通ライブラリ下にCPANモジュールを追加する方法を紹介しています。多くの人はこれらを読んで、「CPANってroot権限無いと駄目なの?」なんて思ってしまいがちなのでは。ちょっと追加設定を施せば一般ユーザでも自分のホームディレクトリ下にインストールできるんだけどなあ・・・という事でここでは
レンタルサーバなり無料WEBスペースなりの環境で、一般ユーザ権限で、自分のホームディレクトリ下にCPAN モジュールをインストールして使用する方法
について簡単に説明したいと思います。
必須条件
- Telnet / SSH 等でサーバに接続&作業ができる事
サーバ側で、ユーザにこのようなリモート接続を禁止している環境だとNGです。 - make コマンドが使える事
ターミナルにて 'which make' と打って、何かしらのパスが返ってくればOK。
目次
CPANとは
以下のWEBページがいい感じに説明してくれています:
セットアップ方法
各作業の意図を都度説明していると長くなるので、ここでは実行すべきコマンドだけをまとめておきます。※興味持ったら、後で perldoc CPAN なりのドキュメントを読んでみてください。
step 1
まずは自分のホームディレクトリにて、以下のコマンドにて幾つかのディレクトリを作ります:
$ cd ~
$ mkdir perl
$ mkdir -p .cpan/CPAN
次に、任意のエディタを使ってファイル .cpan/CPAN/MyConfig.pm を作ります:
$ vi .cpan/CPAN/MyConfig.pm
.cpan/CPAN/MyConfig.pm の中身はこんな感じにしてください:
$CPAN::Config->{cpan_home} = undef;
$CPAN::Config->{makepl_arg} = 'PREFIX=~/perl';
$CPAN::Config->{histfile} = "$ENV{HOME}/.cpan/histfile";
1;
step 2
準備が整ったので CPAN シェルを起動して、初回コンフィギュレーションを済ませます:
$ perl -MCPAN -e shell
対話式にいろいろと聞かれ始めますが、なにも気にせずデフォルト設定のまま Enter キーをバンバン押しまくちゃってOKです。ただ、以下のCPANミラーサイトはどこにする?の質問に対してはきちんと Asia > Japan と答えた上で、任意のミラーサイトを選んであげてください:
どの地域よ?
(1) ...
(2) Asia
(3) ...
(4) ...
Select your continent (or several nearby continents) []
アジアのどこよ?
(1) ...
(2) ...
(7) Japan
(8) ...
Select your country (or several nearby countries) []
どのミラーサイト使う?
(1) ftp://...
(2) ftp://...
(3) ftp://...
Select as many URLs as you like (by number),
put them on one line, separated by blanks, e.g. '1 4 5'
(or just hit RETURN to keep your previous picks) []
'6 7 8' とか、お好みで。※僕もあんま意識したこと無いです。まあ適当に、近いっぽい所を。
step 3
質問攻めの後、プロンプトが出たらとりあえずCPANシェルでの作業は終了です。
cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support enabled cpan>
この後、後述の環境変数への追加設定が必要になります。このまま読み進めていった上で、最後に、自分の環境に適した設定を施してください。
CPANシェルの基本的な使い方
CPANシェルを起動する
$ perl -MCPAN -e shell
または、Perl5.8.1以上の場合ならば...
$ cpan
そんな直感的なコマンドが同梱されているみたいです(*)。まあ素敵。
CPANシェルを終了する
cpan> exit
モジュールをインストールする
cpan> install モジュール名
該当するモジュールがあった場合には、だいたい以下のような流れでインストール作業が実施されます:
- CPANミラーサーバからアーカイブをダウンロード
- インストール設定を対話形式で指定 (ほとんどのモジュールではスキップ)
- 必要ならば依存モジュールのインストールを実施
- コンパイル作業
- 自動テストの実施
- ~/perl ディレクトリ下の適切な場所にインストール
最終的には ~/perl 下に各種モジュールがインストールされます。後は perl 側から使う際に 'use lib' でこのパスを指定してあげれば、これらモジュールを使い始めることができます。
CPANシェルの使い方(ヘルプ)を表示させる
その他使い方については
cpan> h
で表示されるヘルプ画面や perldoc CPAN を参照してください。
CPANシェル起動 + モジュールインストール + CPANシェル終了をワンセットで実行する
$ cpan モジュール名
もしくは
$ perl -MCPAN -e 'install モジュール名'
インストールしたモジュールを perl から使うには
ここでは仮に bashi ユーザとして /home/bashi/perl 下にCPANモジュール 'Template' (別名 Template-Toolkit)をインストールしたとします。その場合、perl / cgi スクリプトの冒頭に、以下のような use lib 句をつけてあげることで、これらモジュールを使うことができるようになります。
sample.cgi
#!/usr/bin/perl use lib '/home/bashi/perl/lib/perl'; use lib '/home/bashi/perl/share/perl'; use Template;
06/21追記 - 環境によって、~/perl 下のディレクトリ構成が異なるみたいです (こまつさん情報)。なので、場合によっては以下の記述にする必要があったり:
use lib '/home/bashi/perl/lib/perl5'; use lib '/home/bashi/perl/lib/perl5/site_perl';
各自 ~/perl ディレクトリ下をチェックした上で use lib 記述をあわせるべし。
環境変数にパスを登録しておく (7/3追記)
~/perl 下にインストールしたモジュールに依存している、また別のモジュールを追加導入する為には、前述の use lib パスを環境変数 PERL5LIB に設定しておく必要がありました。なので、.bashrc などのシェル設定ファイルに
export PERL5LIB=/home/bashi/perl/lib/perl:/home/bashi/perl/share/perl
のような、コロン区切りのパス記述を追加しておきませう。注)bash の場合は export ですが、シェルの種類によっては setenv だったりしますのでご注意。※いい加減、設定が複雑になってきた... orz 他に素敵な方法あったら教えてくださいませ。
以上、 enjoy perl life with CPAN :)
おまけ
本筋と関係ないうんちくを少々。~/.cpan/CPAN/MyConfig.pm の内容をなぜ
$CPAN::Config->{cpan_home} = undef,
$CPAN::Config->{makepl_arg} = 'PREFIX=~/perl',
$CPAN::Config->{histfile} = "$ENV{HOME}/.cpan/histfile",
にしたのかについての細かな補足。'cpan> o conf init' でいいじゃんか?
CPANシェルの対話式設定は、初心者はワリとひいてしまう気がするので、極力、質問に対して答える必要の無い手順にしておきたくてこんな風になってます。MyConfig.pm に事前に値を設定しておくとこれがかなり楽チンになります。同様に、最近のCPANモジュールに追加された '$ perl -MCPAN -e mkmyconfig' も、いちいち値を指定する必要があるので面倒かなぁと。
cpan_home を undef にしておくことで強制的に configuration を走らせる。makepl_arg は、サーバ環境によってはデフォルト値が 'INSTALL_DIR=site' になっていることがあるみたいなので、明示指定をしておく。histfile は、たとえ cpan_home 値を ~/.cpan に指定したとしても、なぜか /root/.cpan/histfile がデフォルトになってしまうみたい (v1.7601の場合)なので、あえて指定をしておく。そんな感じです。
あと、perl側での use lib 指定で 'lib/perl' と 'share/perl' の両方を指定しているのは、僕が試した環境 (Debian sarge) ではモジュールによって share/perl ディレクトリ下にインストールされるものが多数あったので (eg. CGI, Unicode::RecursiveDowngrade) 。この辺 OS の知識不足ゆえ理由がわからないまま、とりあえず use lib を増やしてみた次第。
アホ、もっとスマートなやり方あるわー、という方はぜひご指摘くださいませ・・・。
06/20追記 - はてブのコメントにて、CPAN起動用のコマンド 'cpan' ってのがある事をC_Lさんが教えてくれました(感謝!)。 Perl5.8.1から core module としてついてくるようになったみたいです (こっち5.8.0 / こっち5.8.1)。
- Newer: モジュールをuseした際のメモリ使用量(増加量)を調べてみる
- Older: SafariでAJAX - Scriptエレメントとして読み込むjavascriptソースは、charsetをヘッダで指定した場合でも文字化けする
Comments:9
- こまつ 2006-06-19 (月) 22:14
-
perl -MCPAN -e mkmyconfig
でやると、前半がラクになるみたいです。最近の CPAN.pm じゃないとダメですけど。 - こまつ 2006-06-19 (月) 22:16
-
あああ、最後にしっかりと触れられてますね(汗
エントリ汚してすみません... 削除してください... - bashi 2006-06-20 (火) 14:44
-
いえいえ、コメントありがとうですー♪
こまつさんのエントリ拝見したんですけど、最後の方の 'use lib qw(/home/bashi/perl);' で、うまくモジュール呼び出せてますか?僕の環境だと lib は /home/bashi/perl/share/perl とかなってて、 use lib qw(/home/bashi/perl) だとNGなんです。なんか俺がイケて無いんだと思いますが・・・ - こまつ 2006-06-21 (水) 00:11
-
たしかにダメですね。
use lib qw(/home/komatsu/perl/lib/perl5/site_perl/5.8.5);
とかにしないといけないですね(大汗
perldoc -m lib やってみたら、下のような感じにできて、
use lib;
lib->import("/home/yosty/perl/lib/perl5/site_perl");
これで、下の5つが @INC に加わるみたいです。(-d で確認しているようです。)
/home/komatsu/perl/lib/perl5/site_perl/i386-linux-thread-multi/auto
/home/komatsu/perl/lib/perl5/site_perl/i386-linux-thread-multi
/home/komatsu/perl/lib/perl5/site_perl/5.8.5
/home/komatsu/perl/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi
/home/komatsu/perl/lib/perl5/site_perl
場合によっては少し楽になるでしょうか!?って、またご存知かもしれませんが... - bashi 2006-06-21 (水) 13:46
-
ああ、ほんとですね。環境によって追加すべき lib path が全然変わっちゃうんですね・・・面倒くさーwww。調べてくれてありがとうですー。
import() は、use 宣言時に勝手に呼ばれるものなので、ほっといても、use lib '/home/bashi/perl/lib/perl5/site_perl';
で、自動的に 'site_perl/5.8.5' とか 'site_perl/i386-linux-thread-multi' は追加されるようですね。
- こまつ 2006-06-22 (木) 00:44
-
あらら、またまたお恥ずかしい。
でも、いろいろと勉強になったので書き込んでみてよかったです。またよろしくお願いします。 - nobody 2006-07-02 (日) 13:55
-
環境変数PELR5LIBに追加するディレクトリを設定してみてください。use libを使わなくても追加したモジュールが使えますよ。
- bashi 2006-07-03 (月) 13:14
-
>nobodyさん
アドバイスありがとうございますー。
環境変数をセットしておく方法だと、WEBからCGIとして実行した際に有効にならない(apache が実行→ユーザの.bashrc等による環境設定は無効)よなぁ、と思って避けてみたんです。
・・・俺が無知なだけかも?イイ感じの手法あったらご教授願いますー。 - No Name 2009-01-13 (火) 00:44
-
>PERL5LIB
(許可されていれば)
.htaccess に SetEnvを書けば行けますね