blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_6 ディストリビューション PAUSE

Perl dist ディストリビューション関連の用語 まとめ (d110)

Perl dist ディストリビューション関連の用語 まとめ (d110)

目次 - Perl Index


Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その d110 回。

Perl で、独自のディストリビューション ( distribution ) を作成する際に、遭遇することになるだろう各種用語をまとめる。

今回は、CPAN Testers のガイドを確認する予定を変更して、次の 2 つの記事で確認したディストリビューション関連の用語をまとめます。

Perl 用語の定義 [翻訳] Package, modules and distributions (d108)
Perl [翻訳] CPAN 用語の用語集 A glossary of CPAN terminology (d109)

情報は次の 2 つのページをソースにしています。

A glossary of CPAN terminology - The good, the bad, and the beautiful
Packages, modules and distributions - dagolden

このエントリの項目は次のとおり。

Package パッケージ
Module モジュール
Distribution ディストリビューション
Release リリース
PAUSE ポーズ
CPAN Index シーパン インデクス
Permissions パーミッション
Main module メイン モジュール
Core module コア モジュール
Developer release デベロッパー リリース


Package



Perl のパッケージ ( packeage ) は 1 つの名前空間です。Perl では、名前空間を明示的に宣言するために組み込み ( デフォルトで使える機能 ) のディレクティブ「 package 」が用意されています。

Perl package on perlmod パッケージ (d058)

ディレクティブ「 package 」を使えば、ひとつのファイルの中に複数の名前空間を持つこともできます。「 package 」による宣言を明示的に行わない場合は、そのファイル全体が暗黙的にひとつのパッケージとして扱われます。


package My_pack01;
# My_pack01's namespace
# some code here

package My_pack02;
# My_pack02's namespace
# some code here too



パッケージ名に 2 つのコロン「 :: 」を含めると、それは名前の階層のセパレータ ( ディレクトリセパレータ ) として扱われます。例えば:


package My::Pack;



このようにパッケージ名を「 My::Pack 」にすると、それは「 My/Pack.pm 」という ( Unix ライクな ) 階層を表すことになります。

Perl ディストリビューション h2xs -XAn .pm ファイル (d102)

シンボルテーブルへのアクセスにも「 :: 」を使いますが、それについては (d059) などで確認しました。

また、Perl で「 Object Oriented Programming 」( OOP: オブジェクト指向プログラミング ) を行う場合は、この「 package 」が class の役割を果たします。

Perl オブジェクト指向プログラミング (OOP) 基礎知識 (d067)

配布用のディストリビューションでは、通常パッケージにそのリリースのバージョン番号を指定します。

バージョン番号は、慣例的に ( ? ) スカラ変数「 $VERSION 」を使って定義します。


package My_pack00;
our $VERSION = '0.01';

# Perl 5.12 or later
package My_pack00 0.01;
# or
package My_pack00 v0.0.1;


シンボルテーブルに登録されつつレキシカルなスコープを持つ演算子「 our 」については ( すこしわかりにくいですが ) perldoc.jp を参照します。ちなみに「 my 」はシンボルテーブルに登録されない本当にレキシカルなスコープを持ちます。

変数 $VERSION は定義済みの組み込み変数ではなく、また、その定義が仕様上の必須とされているわけでもありません。

しかし、多くの場合 ( ツールチェーンなど ) では「 $VERSION 」にリリースのバージョン番号がセットされているものと期待されています。

ですから、ディストリビューションでの "良い package" はバージョン番号がセットされたスカラ変数「 $VERSION 」 を持っているべきです。


Module



Perl のモジュールは、ファンクション ( 関数志向 ) またはクラス ( オブジェクト志向 ) のコレクションを含むファイルで、拡張子が「 pm 」( perl module ) になります。通常モジュールのファイルは、慣習としてファイル内のパッケージと同じ名前を持ちます。

つまり、ファイル名が「 My_module.pm 」とされているなら、その中のパッケージ名は「 package My_module; 」と宣言されているはずだということです。

Perl のモジュールは「 use 」または「 require 」を通じて呼び出されますが、呼び出されたモジュールは最後に必ず true 値を返さなければなりません。

これは (d102) 等でも確認したことで、初期化コードの実行が正常に完了したことを示すためのものです。そのため慣習として、モジュールプログラムの末尾には「 1; 」が置かれます。

なお、"良い module" は module と同じ名前の "良い package" を持っています。


Distribution



ディストリビューションは、1 つ以上のモジュールを含むアーカイブファイルで、多くの場合それは "tarball" ( wikipedia ) です。

典型的な CPAN 上のディストリビューションには、test や README 等、モジュール以外の様々なファイルも含まれます。

ディストリビューションの名前は、通常それに含まれるモジュール ( main module ) の名前に由来しています。

モジュールでは、名前空間の階層のセパレータとして「 :: 」を使いますが、CPAN 上にアップロードするディストリビューションの場合は「 :: 」が「 - 」に置き換わります。

例えば、パッケージ「 My::module 」はモジュール「 My/module.pm 」ですが、これをディストリビューションとする場合その名前は「 My-module 」となります。

なお、dagolden の定義によれば、"良い distribution" は、[ a ] "良い module" を含み, [ b ] その module 名の "::" を "-" に置き換えると distribution 名が得られ, [ c ] その module と同じバージョン番号を持っています。


Release



リリースは、CPAN にアップロードされた特定のバージョン番号を持つディストリビューションの特定のインスタンスです。

つまり、ディストリビューション「 My-module 」があった場合、「 My-Module-0.01.tar.gz 」や「 My-Module-0.02.tar.gz 」をそれぞれリリースと呼びます。

典型的な拡張子 ( サフィックス ) は tarball の「 .tar.gz 」で、たまに「 .zip 」があります。

リリースの名前は 3 つのパートからなります。

それは、1. ディストリビューション名 (e.g. My-Module ), 2. バージョン番号 ( e.g. 0.01 ), 3. サフィックス ( e.g. .tar.gz ) で、つまり、例えば「 My-Module-0.01.tar.gz 」です。

"良いリリース" は、リリースと同じバージョン番号のモジュールを持っているはずです。

PAUSE



「 PAUSE 」( ポーズ ? ) は、「 Perl Authors Upload SErver 」の略で、リリースを CPAN にアップロードするために使われるウェブサイトです。

PAUSE の利用には PAUSE のアカウントが必要です。それは、PAUSE id とも呼ばれ、通常は大文字になります。

Please choose an action from the menu. - https://pause.perl.org/pause/query

リリースのアップロードは PAUSE の Web インターフェースを使って行うことができますが、多くの作者 ( Author ) は「 cpan-upload 」などのコマンドラインツールを利用します。


CPAN Index



「 CPAN Index 」は CPAN 上のインストール可能なパッケージ ( パーミッションを持っていて非デベロッパーリリース ) のすべてのエントリを持ったファイルです。これは CPAN 上のモジュールとそれを含むリリースの最新バージョンを教えてくれます。

例えば「 Devel::Cover 」の場合のインデクスは次のようになっています。


Devel::Cover 1.20 P/PJ/PJCJ/Devel-Cover-1.20.tar.gz



最初のフィールドはモジュールの名前、2 番目のフィールドがそのバージョンで、3 番目のフィールドがディストリビューションの名前とそのバージョン ( リリースパス ) です。

パッケージのバージョンとディストリビューションのバージョンは同じでなくても受け入れられますが、バージョンを同期させておく方が多くの人を幸せにするはずです。

CPAN Index は、検索エンジン ( e.g. MetaCPAN や serch.cpan.org ) や CPAN クライアント ( e.g. cpan, cpanm ) によって使われます。

例えば、CPAN クライアントで「 install Devel::Cover 」と唱えると、CPAN クライアントは CPAN Index をチェックします。もしそれがローカルにインストールされているなら、そのバージョンをチェックして Index のエントリと比較します。もし、ローカルのものが古ければ、 CPAN から新しいリリースをインストールします。

Index は、「 02packages.deteils.txt 」というファイルで PAUSE によって生成されます。このファイルは CPAN からダウンロードできます。

$CPAN/modules/02packages.details.txt.gz
($CPAN を http://cpan.org に置き換えてアクセスするとファイルをダウンロードします)


Permissions



もしあなたが PAUSE にアップロードするパッケージ ( 名前空間 ) の最初の人なら、PAUSE はあなたにそのパッケージ名 ( の名前空間 ) での「 first-come ( 先着 ) 」の権利を付与します。

これにより、あなたはそのパッケージ ( 名前空間 ) のオーナーになります。

もしあなたがパッケージを PAUSE にアップロードしたときにその名前空間の first-come の権利を持っているなら、そのパッケージは CPAN Index に追加されます。

first-come の権利を持っている人は、そのパッケージ ( 名前空間 ) の「 co-maint ( 共同管理 ) 」の権利を他の人 ( PAUSE id ) に付与できます。

first-come を持っていないパッケージ ( 名前空間 ) でも、co-main 権限をもっているなら、それもまたアップロードした際に CPAN Index へ追加されます。

PAUSE は、定期的にすべてのパーミッションを「 06perms.txt 」と呼ばれるファイルにダンプします。それは CPAN 上でダウンロードできますが、Index と同じく素のテキストファイルではなく、gzip されたバージョンを取得すると良いでしょう。

$CPAN/modules/06perms.txt.gz

ファイル「 06perms.txt 」のボディは CSV で、「 パッケージ名 」,「 PAUSE id 」,「 パーミッション 」の 3 つのフィールドからなります。


App::Web,JONASBN,f
App::Web,CWINTERS,c



第 3 フィールドの「 f 」は "first-come" を表し、「 c 」は "co-maint" を表します。

もしこのフィールドが「 m 」なら、それは「 モジュールリストに登録済み 」であることを示し、*かつて* リリース前にパッケージ名を予約する方法として使われていたものの名残です。現在この方法は利用できなくなっているので、「 m 」はやがてフェードアウトします。


Main module



メインモジュールは、ディストリビューション名と同じ名前のモジュールです。

現在の PAUSE では、ディストリビューション名と同じ名前のモジュール、つまり、メインモジュールが必須になっています。

しかし、かつてはそうでなかったので、ディストリビューションとモジュールの名前が一致しないものも存在します。


Core module



コアモジュールは Perl 5 にあらかじめ含まれているものです。

もしあなたがプログラム上でコアモジュールのみを使うなら、追加のインストールは発生することがありません。

コアモジュールには、Perl 5 の最初のリリースから含まれていたものと、後のリリースから含まれたものがあります。

あるモジュールがコアであるか知りたい場合は、「 Moudle-CoreList 」に付属する「 corelist 」スクリプトが使えます。例えば:


% corelist Module::CoreList

Data for 2016-10-20
Module::CoreList was first released with perl v5.8.9



これにより、モジュール「 Module::CoreList 」が Perl v5.8.9 から ( 正確には 5.9.2 からのバックポート ? ) コアに入っていることがわかります。

「 corelist 」にオプション「 -v 」と perl のバージョン番号を渡せば、そのバージョンでのコアモジュールとそのバージョンのリストが得られます。


% corelist -v 5.008008

The following modules were in perl 5.008008 CORE
AnyDBM_File 1.00
Attribute::Handlers 0.78_02
AutoLoader 5.60
:
.




Developer release



デベロッパー ( 開発者 ) リリースは、通常の方法で PAUSE にアップロードされますが、CPAN Index には追加されないものです。

ですから、もし誰かがあなたのモジュールをインストールしようとした場合、デベロッパーリリースはインストールされません。もし、非デベロッパーリリースがあるなら、代わりにそれがインストールされます。

デベロッパーリリースは、リリースする tarball のバージョン番号に文字列「 TRIAL 」または「 _ 」( under score ) に続けて 1 つ以上の数字を付け加えます。


# adding "TRIAL"
D/DA/DAGOLDEN/CPAN-Meta-Requirements-2.136-TRIAL.tar.gz

# or adding "_n+"
R/RJ/RJBS/PathTools-3.56_02.tar.gz



デベロッパーリリースでは、あなたのモジュールの安定バージョンを望む人々に影響を与えることなく、一部のユーザからのフィードバックを得ることができます。

例えば、CPAN へのすべての新しいリリースをダウンロードして、自動化したスモークテスターを実行し、その結果を CPAN テスターにアップロードする人がいます。

スモークテスターのほとんどはデベロッパーリリースのテストを行うので、あなたはオペレーティングシステムの範囲や Perl バージョンと構成にわたる有用なフィードバックを得ることができます。

(# CPAN Testers Reports: http://cpantesters.org/ Smoke Tools: http://wiki.cpantesters.org/wiki/SmokeTools Perl CPAN Testers: https://qa.perl.org/cpan-testers/ )

もしあなたのモジュールが他の CPAN ディストリビューションへの依存があるなら、ささいな変更を除いてデベロッパーリリースを行うことを検討したほうがよいでしょう。


NEXT



次回は、改めて CPAN Testers で公開されているディストリビューション作者のためのガイドを確認する予定です。


参考情報は書籍「 続・初めての Perl 改訂版 」, 「 Effective Perl 第 2 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index

































同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲