Digest::MD5 のインストールできない状況でのこと
- [Perl]
CGI::Sessionを使おうとすると、Digest::MD5を使うことになる。もちろん、セッションIDの生成にMD5を指定した(またはデフォルトの)場合だけど。
しかしDigest::MD5はPerl 5.8.0以降なら標準モジュールだけど、プロバイダのサーバがPerl 5.6.1ですぅ、XSモジュールなんてインストールできませーん、てなことも。
よくできたことに、Digest::MD5はXSがロードできなければ、Digest::Perl::MD5を継承してくれる。私は最初知らなくって、CGI::Session::ID::MD5の中身をわざわざDigest::Perl::MD5を使うように修正していた 笑。でも、テストの通ってるCPANモジュールをわざわざ修正なんてしたくないわけで。オリジナルのCGI::Sessionの戻して、Digest::MD5経由でDigest::Perl::MD5を使う方法に変更することに。
で、Digest::MD5をWindows上でINSTALLSITELIB=サーバアップ用の作業ディレクトリとかして、一応Makeの手順を踏んで、バイナリを削除してプロバイダのサーバにアップしようとしたのだけど、Digest::MD5をPerl Makefile.PLすると、Warningが出た。
F:\>Perl Makefile.PL INSTALLSITELIB=c:/workingdir/site/lib Assumes that MSWin32 implies free alignment for U32 access. Warning: prerequisite Digest::base failed to load: Can't locate Digest/base.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at (eval 4) line 3. Writing Makefile for Digest::MD5
ふぅーん、Digest::baseがいるんだ、と思い、Digestも入れることにした。いざ、サーバ上のソースを置き換えると、私のDigest::Perl::MD5置換版のCGI::Sessionでは動作していたソースが、こんな出力。
Undefined subroutine &Digest::base::new called at /foo/bar/site/lib/CGI/Session/ID/MD5.pm line 14.
要するにDigest::MD5->newはXSにしか定義がないので、継承元のDigest::base->newを呼ぼうとして失敗するらしい。Digest::MD5のソースを見たが、Digest::Perl::MD5をロードする場合は、Digest::baseを継承しなくっても特に問題はなさそう。ということで、Digest::baseは削除。一件落着。無事動作した。
ところで、Digestに関して、ベンチマーク古っ[rt.cpan.org]という情報がある。
For example, Digest::Perl::MD5 is far better than Digest::MD5 when you need to
compute message digests and don't have a C compiler :)
たとえば、君がCコンパイラを持ってなくってメッセージダイジェストを計算しなきゃいけないなら、Digest::Perl::MD5の方がDigest::MD5よりはるかにいいよ :)(適当訳)
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/155
コメント