このページは大阪弁化フィルタによって翻訳生成されたんですわ。

翻訳前ページへ


CPAN - CPANサイトからのperlモジュールの問い合わせ、ダウンロード、構築を行う
The Wayback Machine - http://web.archive.org/web/20160707113443/http://homepage3.nifty.com:80/hippo2000/perltips/CPAN.htm

CPANモジュール v.1.58

by Hippo2000(2000/12/19)

CPAN.pmなんやこれがホンマに。

腰が抜けるほど、モジュールのインストールが簡単になるモジュールなんやこれがホンマに。

作者はAndreas Koenigはんや。メールで了解をもろたんですわ。

なお内容等が間ちごとったら修正しまっせ。ご連絡おくんなはれ。

変更履歴:


目次


名前

CPAN - CPANサイトからのperlモジュールの問い合わせ、ダウンロード、構築を行う


おーまかなトコ

対話モード:

  perl -MCPAN -e shell;

バッチモード:

  use CPAN;
  autobundle, clean, install, make, recompile, test

説明

CPANモジュールはperlモジュールのmakeとインストールを自動化するように設計されとりまんねん。そらいくつかの検索機能を持ち、ネットから生のデータを取得するためにNet::FTPまたはLWP(またはlynxや外部のftpクライアント)の使い方を知っとりまんねん。

モジュールは1つまたは複数のミラー化されたCPAN(Comprehensive Perl Archive Network) サイトから取得され、与えられはったディレクトリに解凍されはります。

CPANモジュールはモジュールの名前付きとバージョン付きのbundlesの考えにサポートしまっせ。Bundlesは関連するモジュールのセットの扱いを簡単にしまっせ。下記のBundlesをご覧おくんなはれ。

パッケージにはセッション・マネージャとキャッシュ・マネージャが入っとりまんねん。セッション間で保持されるステータスおまへん。セッション・マネージャは現在のセッションで何が取り出され、構築され、インストールされたかを追跡しまっせ。キャッシュ・マネージャはmakeプロセスにより占有されたディスク・スペースを追跡し、単純なFIFO機能にしたがって過剰なスペースを削除しまっせ。

拡張された検索機能のために、CPANが利用できるプラグイン、CPAN::WAIT.がおます。CPAN::WAITは全文検索エンジンで、CPAN authorsディレクトリで利用できるずぅぇえええぇぇええんぶのドキュメントを索引付けしまっせ。CPAN::WAITがあんさんのシステムにインストールされると、<CPAN.pm>の対話シェルは、インストールで設定されたWAITサーバへ問い合わせを送信するwq、wr、wd、wlほんでwhコマンドが使えるようになるんですわ。

他のみなのメソッドはプログラマ形式と対話シェル形式でアクセスできるように提供されとりまんねん。


対話モード

対話モードには以下のように実行するっちうことで入るんや:

    perl -MCPAN -e shell

こら行読込インターフェースにしまっせ。ヒストリとコマンド完成の両方を楽しむためにTerm::ReadKeyとTerm::ReadLineをインストールするとより楽しめるでっしゃろ。

コマンドラインやったら、'h'を叩いておくんなはれ、ほんで残りはすぐにわかるでっしゃろ。

対話モードでの最も一般的な使用方法は

作者(authors)、バンドル(bundles)、ディストリビューション・ファイル(distribution files)ほんでモジュール(modules)の検索
対応する1文字のコマンド、a、b、dほんでmがそれぞれ4つのカテゴリやらなんやらのためにおます。さらに i は4つのいずれかのためにおます。4つのそれぞれの要素はちびっと異なりよったオブジェクトを表示するためのメソッドを持ったクラスとして実装されとりまんねん。

これらのコマンドに渡す引数は、オブジェクトを識別する文字列に完全にマッチするか、オブジェクトのようけの属性に対して大文字小文字の区別なくマッチする正規表現のいずれかになるんですわ。パーサーは2つのスラッシュで囲んやときだけ、正規表現を解析しまっせ。

原則は見つかったオブジェクトの数が項目の表示のされ方に影響を与えまんねん。もし検索が1つの要素を見つければ、結果はむしろ冗長なメソッドas_stringで表示されはります。せやけどダンさん1つより多ければ、簡潔なメソッドas_glimpseで表示しまっせ。

make, test, install, clean modules or distributions
これらのメソッドは任意の引数を取り、行動を起こすんに何ぞ必要かを調査しまっせ。もし引数がディストリブーション・ファイル名やったら(埋め込まれたスラッシュにより判定されはる)、そら処理されはります。もしそれがモジュールやったら、CPANは、このモジュールが入っとるディストリビューションファイルを判定し、モジュールのMakefile.PLで名づけられはった依存関係に従ってそれを処理しまっせ。(この行動はprerequisites_policy(必要条件ポリシー)によって制御されはる)
 

ずぅぇえええぇぇええんぶのmakeまたはtestは無条件に実行されはります。

  install <distribution_file>

も無条件に実行されはります。せやけどダンさん

  install <module>

では、CPANは、インストールがホンマにそれに必要なんかをチェックし、ほんでそのディストリビューション・ファイルに更新する必要があらへんモジュールが入っとった場合には、module up to date (最新版)と出力しまっせ。

CPANは現在のセッションで何をしたかを追跡し、ほんでそれが性交...ひひひ,ウソや,成功したかどうかにかかわらへんし、パッケージを2度ビルドしたろおもてはしまへん。forceコマンドは最初の引数を(現在は:make、testまたはinstall)呼出し、ほんではじめからコマンドを実行するように取るんや。

例:

    cpan> install OpenGL
    OpenGL is up to date.
    cpan> force install OpenGL
    Running make
    OpenGL-0.4/
    OpenGL-0.4/COPYRIGHT
    [...]

cleanコマンドは結果として ディストリビューション・ファイルの作業ディレクトリでの

  make clean

が実行されはります。

get, readme, look モジュールまたはディストリビューション
get はそれ以降の行動なしでディストリビューション・ファイルをダウンロードしまっせ。readmeは関連するディストリビューションのREADMEファイルを表示しまっせ。Lookは(まだやったら)ディストリビューション・ファイルを取得し、untarし、適切なディレクトリに変更し、そのディレクトリでサブシェル・プロセスを開きまんねん。
シグナル
CPAN.pmはSIGINTとSIGTERMのためのシグナル・ハンドラをインストールしまっせ。cpan-shellにおる間、あんさんがいつ^Cを押したかてspan-shellプロンプトに戻ることができるようになっとりまんねん。SIGTERMはcpan-shellにきれいにして、シェル・ループから離れさせまんねん。SIGTERMの影響を2回続いたSIGINTでエミュレートするっちうことができまんねん。こら通常^Cを2回押したことを意味しまっせ。

CPAN.pmはSIGPIPEをシカトしまっせ。もしユーザが inactivity_timeoutを設定すると、perl Makefile.PLサブプロセス実行中にSIGALRMが使われはります。


CPAN::Shell

シェル・インターフェースで利用できるコマンドはCPAN::Shellパッケージでのメソッドや。もしシェル・コマンドをぶちこむと、入力されたずぅぇえええぇぇええんぶのもんはText::ParseWords::shellwords()ルーチンによって分割されはります。こらほとんどのシェルがするように行われはります。最初の単語は呼び出されるメソッドとして、残りの単語はこのメソッドへの引数として解釈されはります。もし行のケツがバックスラッシュやったら、行の続きがサポートされはります。


autobundle

autobundle はバンドル・ファイルを$CPAN->Config->{cpan_home}/Bundleディレクトリに書込みまんねん。そのファイルにはCPANからと現在@INCにインストールされとる両方から利用どるずぅぇえええぇぇええんぶのモジュールが入るんや。バンドル・ファイルの名前は現在の日付とカウンタが基本になるんですわ。


再コンパイル(recompile)

recompile() はどエライ特殊なコマンドで、引数をとらへんし、ずぅぇえええぇぇええんぶのインストールされとる動的にロードできる拡張(なんちうか、ようみなはんいわはるとこのXSモジュール)に対して'force'を有効としてmake/test/installのサイクルを強引に実行しまっせ。このコマンドの基本的な目的は、ネットワーク・インストールを完了させることや。2つの異なるアーキテチャのための共通なソース・ツリーを持っとるとしまっせ。完全に独立した新しいインストールをするっちうことを決意しまっせ。既にあるバンドル(Bundle)ファイルの助けをかりて1つのアークテクチャに対して開始しまっせ。CPANはずぅぇえええぇぇええんぶのバンドルをインストールしまっせ。せやけどダンさん2番目のアーキテクチャでその仕事を繰り返そうとすると、CPANはずぅぇえええぇぇええんぶのモジュールに対して"Foo up to date"ちう文句を返しまっせ。ほんでCPANのrecompileを2番目のアーキテクチャに呼び出して、行うことができまんねん。

recompileのもう1つのようある利用法は、perlがバイナリ互換性を壊したときや。もしCPANが使うモジュールがバイナリ互換性に依存しとったら(そのためCPANコマンドを実行できなければ)、回復するためにCPAN::Noxモジュールを試してみなければならしまへん。


4つのCPAN::* クラス: Author, Bundle, Module, Distribution

こら内部のことと考えられはるが、クラス階層はユーザとプログラマの両方に関わりがおます。CPAN.pm上記の4つのクラスを扱い、ほんでそれらのずぅぇえええぇぇええんぶがメソッドを共有しまっせ。事実上、古典的な1つの多態性や。メタクラス・オブジェクトはみなの種類のみなのオブジェクトを登録し、文字列で索引をつけまんねん。オブジェクトを表す文字列は分けられはった名前空間を持ちまんねん(完全には分割されしまへん):

         名前空間                         クラス
   "/"(スラッシュ)が入った単語          Distribution
    Bundle::で始まる文字列                  Bundle
          その他                          Module もしくは Author

Modulesはそれに関連するDistribution オブジェクトを知っとりまんねん。それらは常に最も新しい公式のリリースを参照しまっせ。開発者は(目に見えるバージョン番号にアンダーバーをぶちこむことにより)リリースを安定しておらへん開発バージョンと印をつけることができまんねん。そのためホンマに最もホットで新しいディストリビューション・ファイルが常にデフォルトになるわけやおまへん。もしモジュールFooがCPANで1.23と1.23_90が配布されていれば、CPAN.pmは以下のようにするっちうことによって、バージョン1.23をインストールするような手近な方法を提供しまっせ。

. install Foo

こらずぅぇえええぇぇええんぶのもんがついた完全なディストリビューション・ファイル(BAR/Foo-1.23.tar.gz)をインストールしまっせ。せやけどダンさんバージョン 1.23_90をインストールしたければ、authors/id/directoryでの相対でCPANでのどこにディストリビューション・ファイルがあるかを知る必要がおます。もし作者(author)がBARやったらば、こらBAR/Foo-1.23_90.tar.zかもしれしまへん。そないなら以下のようにします

    install BAR/Foo-1.23_90.tar.gz

最初の例はCPAN::Moduleクラスのオブジェクトによって行われ、2番目はCPAN::Distributionクラスのオブジェクトによって行われはります。


プログラマ・インタフェース

シェルに入らな、利用可能なシェルコマンドはメソッドとしたかて(CPAN::Shell->install(...))、ほんで呼出しパッケージの中での関数としたかて(install(...))使うことができまんねん。

現在のトコ、たった1つだけ?CPAN::Shellが安定したインターフェースを持っとりまんねん。CPANシェルで利用できるずぅぇえええぇぇええんぶのコマンドはCPAN::Shellのメソッドや。モジュールの一覧を作成するコマンド(r、autobundle、u)のそれぞれも、リストのなかのずぅぇえええぇぇええんぶのモジュールのIDのリストを返しまっせ。

expand($type,@things)
プログラムの中で利用できるずぅぇえええぇぇええんぶのオブジェクトのIDはCPAN::Shell->expand("Module", @things)メソッドで実際のオブジェクトに展開できる文字列や。expandは与えられはった@things引数に従ってCPAN::Moduleオブジェクトのリストを返しまっせ。スカラ・コンテキストではリストの最初の要素だけを返しまっせ。
 
プログラム例
こらプログラマにシェルで利用できる機能を結合する操作を可能にしまっせ。
    # ディスク上にある古くなりよったずぅぇえええぇぇええんぶのもんをインストールする:
    perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'
    # 必要やったら好きなプログラムをインストールする
    for $mod (qw(Net::FTP MD5 Data::Dumper)){
        my $obj = CPAN::Shell->expand('Module',$mod);
        $obj->install;
    }
    # ディスク上にあるVERSION番号を持っておらへんずぅぇえええぇぇええんぶのモジュールの一覧を出力
    for $mod (CPAN::Shell->expand("Module","/./")){
        next unless $mod->inst_file;
        # MakeMaker convention for undefined $VERSION:
        next unless $mod->inst_version eq "undef";
        print "No VERSION in ", $mod->id, "\n";
    }
    # CPAN上であるモジュールが入っとるディストリビューションを探す:
    print CPAN::Shell->expand("Module","Apache::Constants")->cpan_file

またはCPANを見るようなcronジョブを書きたければ、更新する必要があるずぅぇえええぇぇええんぶのモジュールの一覧を出すことができまんねん。最初にはよて汚い方法:

    perl -e 'use CPAN; CPAN::Shell->r;'

ずぅぇえええぇぇええんぶのモジュールが最新やったら、なあんも出力を取得したくなければ、上記のコマンドの出力を正規表現//modules are up to date// で解析し、マッチせぇへんかった場合だけ出力をメールするように決めることができまんねん。

もし1つの処理でよりプログラマ的な方法でそれをしたければ、以下のようにするっちうことができまんねん:

  # ディスク上からCPAN上により新しいバージョンがあるずぅぇえええぇぇええんぶのモジュールの一覧
  for $mod (CPAN::Shell->expand("Module","/./")){
    next unless $mod->inst_file;
    next if $mod->uptodate;
    printf "Module %s is installed as %s, could be updated to %s from CPAN\n",
        $mod->id, $mod->inst_version, $mod->cpan_version;
  }

もし毎日ごっつうもようけの出力をだすのやったら、3つのモジュールだけにしたいかもしれしまへん。1行目を以下のように書くことができまんねん。

  for $mod (CPAN::Shell->expand("Module","/Apache|LWP|CGI/")){

もしくは上記のいくつかの方法を組み合わせることができまんねん:

  # 新しいmod_perlモジュールだけを見る
  $mod = CPAN::Shell->expand("Module","mod_perl");
  exit if $mod->uptodate;
  # 新しいmod_perl が届いたら、ずぅぇえええぇぇええんぶの更新のすすめを教えて
  CPAN::Shell->r;

4つのクラスでのメソッド


キャシュ・マネージャ

現在はキャッシュ・マネージャはbuildディレクトリ($CPAN::Config->{build_dir})だけを追跡しまっせ。そこにあるずぅぇえええぇぇええんぶのディレクトリの大きさが$CPAN::Config->{build_cache} (MB単位)よりも大きくなりよったら、.build_dirの下にあるディレクトリを削除するんは、単純なFIFO機構や。このキャッシュの内容は後から手動で行おうとする再インストールのために使われるかもしれしまへんが、CPANそのもんからはまるっきし信用されしまへん。こらユーザがこれらのディレクトリを異なるアーキテクチャでのモジュールの構築のために使うことができるためや。

元のディストリビューション・ファイルが保管される他のディレクトリ($CPAN::Config->{keep_source_where})がおます。このディレクトリはキャッシュ・マネージャによってカバーされてへんねん。ほんでユーザによって制御されなければならしまへん。もしbuild_dirとkeep_source_whereに同じディレクトリを選択したら、同じFIFO機能でソースも削除されはります。


Bundles

Bundleはなあんも関数やメソッドを定義せん単なる名前空間Bundle::のperlモジュールや。それには通常ドキュメントだけが入っとりまんねん。

そらperlモジュールのようにpackage宣言と$VERSION変数から始まるんや。その後、podセクションは他のpodと同じように見えまんねん。唯一の違いは、(逐語的に)以下のように始まる1つの特別なpodセクションone special pod section )があることや:

        =head1 CONTENTS

このpodセクションの各行は以下のフォーマットに従おりますわ。

        モジュール名 [バージョン文字列] [- オプションのテキスト]

唯一必須の部分は最初のフィールド、モジュール名や(例あげたろか、たとえばやなあ Foo::Bar ゴチャゴチャゆうとる場合やあれへん、要は ディストリビューション・ファイル名ではおまへん)。行の残りはオプションや。コメント部分は、manページ・ヘッダと同じようにダッシュで区切られはります。

bundleのディストリビューションは他のディストリビューションと同じ書き方に従おりますわ。

BundlesはCPANパッケージの中では特別に扱われはります。もし"install Bundle::Tkkit"とすると(そないな風なBundleがあるもんとします)CPANはpodのCONTENTSセクションでのずぅぇえええぇぇええんぶのモジュールをインストールしまっせ。 @INCパスのどこぞに同じ構造のBundleファイルを置くことによりローカルに独自のBundleをインストールするっちうことができまんねん。シェル・インタフェースで利用できるautobundle()コマンドはスナップショット・バンドル・ファイルに現在インストールされとるずぅぇえええぇぇええんぶのモジュールがぶちこむことによりそれをおけぇへんまんねん。


前提条件

もしローカルなCPANミラーを持ってて、"file:" URLやべてのファイルにアクセスするっちうことができるのやったら、このモジュールを実行するにはperl5.003よりも新しいperlであることやけが必要や。そうやないとNet::FTPがつよ推奨されはります。LWPはUNIXではおまへんシステムせやなかったら最も近いCPANサイトがftp:ではおまへんURLに関連付けられていれば、必要かもしれしまへん。

もしNet::FTPもLWPも持っていなければ、頼みの綱として外部ftpコマンドまたは外部lynxコマンドのための機能が実装されとりまんねん。


パッケージとバージョン(VERSION)を見つける

このモジュールはCPAN上のずぅぇえええぇぇええんぶのモジュールが以下のようであるもんと考えまんねん

    perl -MExtUtils::MakeMaker -le \
        'print MM->parse_version(shift)' filename

もしパッケージの作者で、$VERSIONが解析されるか心配やったら上記の方法を試してみておくんなはれ。


デバッグ方法

このモジュールのデバッグはちーとばかし複雑や。ちうのもCPAN上の索引を作成するプログラム、CPANのミラー化処理、パッケージ化、構成設定、 いっぺん性、ほんでCPAN.pmの中のバグの干渉を受けるさかいや。

対話モードでのデバッグでは、"o debug"を試すことができまんねん。こらコードのさまざまな部分をデバッグするためのオプションの一覧を出しまっせ。"o debug"が組み込の完了サポートを持っとることも知っておくべきや。

データ・デバッグでは、make/test/installと同じ引数をとり、オブジェクトのData::Dumperダンプを出力するdumpコマンドがおます。


フロッピー、Zip、オフラインモード

CPAN.pmはネットワークなしでもあんじょう動きまんねん。まるっきしネットワークにつながっておらへんマシンを管理してんねんさかいあれば、file: URLで動かすことを考えなければならしまへん。もちろん先にどこぞでモジュールを集めてくる必要がおます。ほんでネットワークにつながったマシーンに必要とするずぅぇえええぇぇええんぶを置くためにCPAN.pmかもしれしまへん。ほんでフロッピーの$CPAN::Config->{keep_source_where} ($CPAN::Config->{build_dir}でななく) にコピーしまっせ。このフロッピーは個人的なCPANの一種や。ネットワークにつながっておらへんマシンでのCPAN.pmは、このフロッピーであんじょう動きまんねん。以下のCD-ROMサポートについてパラグラフもご覧おくんなはれ。


構成設定

CPANモジュールがインストールされると、サイト全体で利用される構成設定ファイルがCPAN/Config.pmとして作成されはります。ここで定義されとるデフォルト値は他の構成設定ファイル:CPAN/MyConfig.pmで上書きするっちうことができまんねん。そないなければ、このファイルを$HOME/.cpan/CPAN/MyConfig.pmに格納するっちうことができまんねん。ちうのも$HOME/.cpanはuse()またはrequire()ステートメントの前にCPANモジュールの検索パスに追加されるさかいや。

現在、ハッシュ・リファレンス $CPAN::Configでは以下のキーが定義されとります:

  build_cache        モジュールをビルドするためのディレクトリのためのキャシュの大きさ
  build_dir          モジュールをビルドするためにローカルにアクセスできるディレクトリ
  index_expire       何日後にインデックス・ファイルを再取得するか
  cache_metadata     メタデーエタをキャシュするためにシリアライザを使う
  cpan_home          このパッケージのために予約されとるローカルなディレクトリ
  dontload_hash      無名ハッシュ: そのキーのモジュールはCPAN::has_inst()ルーチンで
                     ロードされへん
  gzip               外部プログラムgzipの場所
  inactivity_timeout 動かいなくなってから何秒後に対話的なMakefile.PLをブレークするか
                     0にするとブレークせん。
  inhibit_startup_message
                     もしtrueやったら、起動文句を表示せん
  keep_source_where  ソースが保管されるディレクトリ(もしそうしたら)
  make               外部のmakeプログラムの場所
  make_arg           'make'に常に渡される引数
  make_install_arg   'make install'に渡される引数
  makepl_arg         'perl Makefile.PL'に渡される引数
  pager              外部プログラムmore(または他のページャー)の場所
  prerequisites_policy
                     モジュールの前提条件を満たしておらへんときにどうするか
                     ('follow' なあんもせんとホッタラかしといても従うか, 'ask' 尋ねる, もしくは 'ignore' シカト)
  scan_cache         キャッシュの検索を制御('atstart'(開始時点) または 'never')
  tar                外部プログラムtarの場所
  unzip              外部プログラムunzipの場所
  urllist            ねきのCPANサイト(または同等の場所)への配列リファレンス
  wait_list          試してみるwaitサーバの配列リファレンス(CPAN::WAITをご覧おくんなはれ)
  ftp_proxy,      }  構成設定のための3つの通常の変数
    http_proxy,   }  プロキシー要求。 CPAN::Config 変数として、ほんで設定可能な
    no_proxy      }  環境変数として

o conf コマンドで定義されとるコマンド・セットでCPANシェルのなかで対話的にこれらのオプションを設定せやなかったら問い合わせることができまんねん。

o conf <scalar option>
スカラー・オプションの現在の値を出力
o conf <scalar option> <value>
スカラー・オプションの値をvalueに設定
o conf <list option>
リスト・オプションの現在の値をMakeMakerのneatvalue形式で出力
o conf <list option> [shift|pop]
リスト・オプション変数の配列をシフト(shift)せやなかったらポップ(pop)する
o conf <list option> [unshift|push|splice] <list>
対応するperlコマンドのように動く

urllistパラメータのフォーマットについての用心

urllist パラメータはRFC 1738に従ったURLや。もしURLが準じていなければどないなるかようわからしまへん。せやけどダンさんファイルURLで問題があるんやったら、正しいフォーマットを試してみておくんなはれ:

    file://localhost/whatever/ftp/pub/CPAN/

もしくは

    file:///home/ftp/pub/CPAN/

urllistパラメータでのCD-ROMサポート

構成テーブルでのurllistパラメータにはダウンロードのために使われるURLのリストが入るんや。もしリストにfile URLがあると、CPANは常にまずそこからファイルを取得したろおもてまんねん。こらインデックス・ファイルには使うことがでけしまへん。そのためCPANの内容が入ったCD-ROMを持っとる人に推奨されることは、ローカルの、古くなっとるかもしれへんCD-ROMをurllistのケツにfile URLとしていれることや。例あげたろか、たとえばやなあ以下のように:

  o conf urllist push file://localhost/CDROM/CPAN

CPAN.pmはそうしたら、urllistのアタマにあるCPANサイトからインデックス・ファイルを取り出しまっせ。後でそら、最も新しいバージョンがローカルにあるかをチェックしまっせ。

もう1つのurllistの特徴はケツにファイルを正常に取得できたサイトがなあんもせんとホッタラかしといてもヒイキされ、次の要求での最初のサイトとして試されることや。そのため実行時に新しいサイトを追加すると、前にヒイキされたサイトが他のときに最初に試されるかもしれしまへん。次の転送であるサイトを使いたくなければ、urllistから明示的に削除せなならへんことになるんや


セキュリティ

CPAN.pmでは強いセキュリティ・レイヤはおまへん。CPAN.pmは外からの、マスクされておらへん、署名されておらへんコードをあんさんのマシンにインストールするんを手助けしまっせ。ネットから攻めて来よったチェックサムとディストリビューション・ファイルそのもんとを比較しまっせ。だれかがディストリビューション・ファイルをうまいこといじったら、CHECKSUMSファイルもいじってしもたかもしれしまへん。将来の開発では強い認証を目指しまっせ。


エキスポート

パッケージCPANの中のほとんどの関数はデフォルトでエクスポートされはります。こら基本的な使用法がcpanシェルまたはワンライナーを指向してんねんさかいや。


あるインストールへの数ようけのモジュールの移植

わての好きなモジュールを新しくインストールされたperlに移植するっちうことは、プライベートなbundel定義ファイルを保持するっちうことによりどエライ簡単や。便利ええbundl定義ファイルの青写真を取得するために、コマンドautobundleをCPANシェル・コマンド行で使うことができまんねん。このコマンドは現在実行されとるperlインタープリターのためにインストールされとるずぅぇえええぇぇええんぶのモジュールのためのbundle定義ファイルをかき出しまっせ。このコマンドはいっぺんだけ実行し、ほんで後はそのファイルを手動でプライベートな名前 Bundle/my_bundle.pmで保持するっちうことが推奨されはります。上手なbundleファイルでは、単に以下のようにするだけや

    cpan> install Bundle::my_bundle

後はちーとばかし質問に答えたら、コーヒーをのみに出かけまひょ。

bundle定義ファイルを保持するっちうことは、2つのことを追跡するっちうことになるんや:依存性と相互関係や。CPAN.pmはときどき依存性を計りかねることがおます。ちうのもずぅぇえええぇぇええんぶのモジュールがずぅぇえええぇぇええんぶのMakeMaker属性を正しく定義するゆうわけやのうて、そのためbunlde定義ファイルができるだけはよ前提条件を指定せなならへんためや。

一方、ようけのディストリビューションはときどき対話的な設定を必要とするんはちーとばかし難儀や。プライベートなbundleファイルでやろうとしてんことは、設定されることを必要とするパッケージを先に、静かいなもんを後にファイルに持ち、そのため2、3分たったら出かけて、CPAN.pmをほっておくようにしたろおもておりますわ。


ファイヤウォールの内側でCPAN.pmを動かす

perlとさまざまなファイヤウォール構成との間の相互作用についての以下のパラグラフを寄稿してもろたGraham Barrに感謝しまっせ。ファイヤ・ウォ?ルについてのさらなる情報はncftpプログラムについてくるドキュメントにあたることをお勧めしまっせ。簡単なperl設定ではファイヤ・ウォールを通せへんのやったら、それがあんさんのファイヤ・ウォールでも機能するようにncftpを設定するようになることになるでっしゃろ。


3つの基本的なファイヤウォールの型

ファイヤウォールは以下の3つの基本型に分類するっちうことができまんねん。

http firewall
こらファイヤウォール・マシンがWebサーバーを実行し、外の世界にアクセスしたければそのWebサーバを経由せなならへんトコロです。http_proxyまたはftp_proxyのような環境変数をhttp://から始まる値に設定するか、Webブラウザではプロキシー情報を設定する必要があれば、httpファイヤウォールが動いとることが分かるんや。

perlで、これらのタイプのファイヤウォールの外側にあるサーバーにアクセスするためには(ftpのためであっても)LWPを使う必要がおます。

ftp firewall
こらファイヤウォール・マシンがftpサーバーを実行してんトコロです。この種類のファイヤウォールはファイヤウォールの外側にあるftpサーバーにアクセスさせようとしまっせ。こら通常、ファイヤウォールとftpを接続するっちうことにより行われ、"user@outside.host.com"のようなユーザ名を入力しまっせ。

perlで、これらのタイプのファイヤウォールの外側にあるサーバーにアクセスするためにはNet::FTPを使う必要がおます。

一方向可視性(One way visibility)
一方向可視型とは、これらのファイヤウォールはファイヤウォールの内側のユーザに、彼ら自身を見えなくさせようとするっちうことや。Ftpデータ接続は通常にリモートにあるサーバにあんさんのIPアドレスを送信するっちうことで作成され、接続をlistenしまっせ。せやけどダンさんリモートのサーバはファイヤウォールのためにあんさんに接続でけしまへん。そのためこれらのタイプのファイヤウォールではFTP接続は受動(passive)モードでおこなう必要がおます。
 
わてが考えておらへんもんは2つおます。
SOCKS
もしSOCKファイヤウォールを使うておるやったらば、perlをコンパイルし、SOCKSライブラリをつけてリンクする必要がおます。こら通常'socksified'(ソケット化された) perlと呼ばれはります。この実行形式やったら、それがあらへんかにょうにファイヤウォールの外側のサーバに接続する事ができまんねん。
IP Masquerade
こらLinuxカーネルで実装されとるファイヤウォールで、1つのIPアドレスの先にあるネットワークを完全に隠すことを可能にしまっせ。これのファイヤウォールではホストに直接アクセスできるので特別なコンパルをする必要はおまへん。

ファイヤ・ウォールを通るためのlynxまたはncftpの設定

例あげたろか、たとえばやなあlynxでワイが思うには以下のようなコマンドでファイヤ・ウォールを通ることができるのやったら、

    /usr/local/bin/lynx -pscott:tiger

CPAN.pmを以下のようなコマンドで設定しまっせ。

    o conf lynx "/usr/local/bin/lynx -pscott:tiger"

それだけや。ncftpやftpでも同じように、以下のようにします

    o conf ncftp "/usr/bin/ncftp -f /home/scott/ncftplogin.cfg"

あんさんの道のりはちゃうかもしれしまへん...


FAQ

 

  1. ) モジュールXの新しいバージョンをインストールしたんやけど、CPANは古くさいバージョンがインストールされとるとええつづけとります

    ホンマに古くさいバージョンがインストールされとる可能性が高いや。モジュールを前にインストールしたのとは別の@INCパスにあるディレクトリにインストールした場合におこるんや。こらホンマはCPAN.pmの問題やのうて、手動でそのモジュールをインストールしたかて同じ問題になるかもしれしまへん。この動きを阻止する簡単な方法は、make install呼出しに引数 UNINST=1を追加するっちうことで、ようけの人が設定するっちうことによりこの引数を永続的追加しまっせ。

      o conf make_install_arg UNINST=1
    
  2. ) ほななんでUNIST=1がデフォルトではおまへんか?

    だれが@INCパスのどこにインストールしたんか、ほんでだれがどこの@INCを使うておるんかについての完全な予測をしてん人がおるからや。良うチューニングされた環境ではUNIST=1がダメージを与えてまうかもしれしまへん。

  3. ) わては散らかっとるもんをずぅぇえええぇぇええんぶ片づけて、、今もっとるモジュールと一緒に新しくperlをインストールしたろおもて思とります。どうしたらよいでっしゃろか?

    古くさいperlでautobundleコマンドを実行し、結果のbundleファイルを適切に名前を変え(例あげたろか、たとえばやなあ Bundle/mybundle.pm)、新しいperlをConfigure にprefixオプションをつけてインストールしまっせ。例あげたろか、たとえばやなあ

        ./Configure -Dprefix=/usr/local/perl-5.6.78.9
    

    最初の段階で作成したbundleファイルを以下のようにしてインストールします

        cpan> install Bundle::mybundle
    

    これで終わりや

  4. ) bundleや複数のモジュールを1つのコマンドでインストールすると、追いかけなきゃならへん出力が多すぎる

    以下のように設定するっちうことができまんねん

      o conf make_arg "| tee -ai /root/.cpan/logs/make.out"
      o conf make_install_arg "| tee -ai /root/.cpan/logs/make_install.out"
    

    こうするとSTDOUTは後から見ることができるようにファイルに出力されはる

  5. ) rootやおまへん。どうしたら個人的なディレクトリにインストールするっちうことができまっしゃろか?

    いっちゃんありそうな方法は以下のようにするっちうことや

      o conf makepl_arg "LIB=~/myperl/lib \
                        INSTALLMAN1DIR=~/myperl/man/man1 \
                        INSTALLMAN3DIR=~/myperl/man/man3"
      install Sybase::Sybperl
    

    この設定をo conf 設定、o conf commitとするっちうことで永続化させることができまんねん。

    ~/myperl/man をMANPATH環境変数に追加するようがあるかもしれしまへん。また同様に/myperl/libを見るようにperlプログラムにするために、例あげたろか、たとえばやなあ以下の行を追加する

      use lib "$ENV{HOME}/myperl/lib";
    

    もしくはPERL5LIB環境変数を設定する必要があるかもしれしまへん。

    もう1つ気をつけなければならへんことは、rootやないとUNINSTパラメータを設定してはならへんことや。

  6. ) ビルドする前に、パッケージを取得し、解凍し、変更するにはどうしたらよいでっしゃろか?

    Sybase::Sybperlをご覧おくんなはれ

  7. ) Bundleをインストールして、いくつかシッパイしましたわ。 もういっぺんやると、ずぅぇえええぇぇええんぶがあんじょう解決しまっせ。こら最初のもんを修正できれおるんでしょうか?

    こら開始時点では、CPANはずぅぇえええぇぇええんぶのモジュールの依存関係を知らんためや。インストールする追加のアイテムについて判断するためには、作成されたMakefileで見つかったデータを使うだけや。いわられへんかった失われたピースは処理を中断しまっせ。せやけどダンさんそらBundleがいくつかの依存する要素の後にその前提条件となるもんをインストールするかもしれへんし、そのため2度目の挑戦ではずぅぇえええぇぇええんぶが解決するっちうことがおます。CPAN.pmは先に依存関係のツリーを知らんちうこと、ほんでトポロジカルに正しい順序でインストールするために物事の順序を並べ直すことはできなちうことに用心しておくんなはれ。ずぅぇえええぇぇええんぶのモジュールが前提条件となるもんをMakeMakerへのPREREQ_PM属性を正しく宣言していれば、正しく解決できまんねん。Bundleについてはもしシッパイし、なんどもインストールする必要があれば、Bundle定義を手で並べ直すことをお勧めしまっせ。CPANでの一般的な依存関係についてのメタデータの条件は改善する予定やけど、そやけどアンタ、それにはまだ時間がかかるんや。

  8. ) イントラネットで内部で使うためのモジュールをようけ持っとりまんねん。CPANにモジュールをインストールするっちうことなく、これらのモジュールをCPAN.pmでどないな風にしたら統合するっちうことはできまっしゃろか?

    CPAN::Siteモジュールをご覧おくんなはれ

  9. ) CPANのシェルを実行すると、line 1 to 4, setting meta input/output via the /etc/inputrc file(/etc/inputrcファイルを介するメタ入出力設定)のアヤマチ文句がでまんねん

    わてに言えることは/etc/inputrcはTerm::ReadLineに何らかの関係がおます。ワイが思うには/etc/inputrcを削除するかまたはINPUTRC環境変数を設定するだけや(readlineドキュメントをご覧おくんなはれ)


バグ

ウチらはPAUSE部分だけでなく、CPANのみなをカバーすべきとちゃうでっしゃろか?この議論では、CPANとPAUSEは既に同じになったんやか?せやけどダンさんそうやおまへん。PAUSEはauthors/, modules/ ほんで scripts/や。CPANはPAUSEに加えて、clpa/, doc/, misc/, ports/,ほんで src/や。

将来の開発では、さらに他の部分の統合を目指しまっせ。

もしMakefile.PLがライブラリ、特別な入力のためのプロンプトやらなんやらの特別なカスタマイズを必要としてんと、CPANがそのディストリビューションを構築でけへんことがあるかもしれしまへん。その場合には、シェルからPerlモジュール・パッケージを構築する伝統的な方法を試さなならしまへん。


作者

Andreas Koenig <andreas.koenig@anima.de>


参考資料

perl(1), CPAN::Nox(3)


ホーム Perlの小技

ご意見、ご質問はウチの掲示板で受け付けとりまんねん。
またメールは河馬屋(Nifty)にお願いしまっせ。