たけまる / cpan2pkg - .deb を賢く自動作成
2008-03-31
_
cpan2pkg - .deb を賢く自動作成 [cpan][debian]



CPAN モジュールを .deb にするスクリプトを作りました.単純に .deb にまとめるだけでなく,もう少し賢く振る舞ってくれます.
# 同じことをしている人はたくさんいそうだし,ツールも公開されているの
# かもしれませんが,見つからなかったので作ってみました.より良いもの
# をご存じの方がいましたら教えてください.
開発環境のモジュール構成を忠実に再現したいときに使います.次のよう
な状況を想定しています.
- cpan コマンドでモジュールをインストールして開発し,テストしている
- 運用マシンにも同じバージョンでモジュールをインストールしたい
- Perl をよく知らない人でも扱えるように,.deb にしておきたい
- 開発マシンにインストールされているすべてのモジュールではなく,指
定したモジュールとその依存モジュールのみインストールしたい
つまり,単に .deb を作成するだけではなく,依存モジュールを自動的に
解決します.また,現在のマシンと同じバージョンで .deb を作成してく
れます.
■ 使い方
使い方は簡単です.開発マシンで,.deb にしたいモジュールを標準入力
かファイルで渡します.ファイルで渡すときは,モジュール名を空白か改
行で区切って列挙してください.プロキシがあるときは環境変数
http_proxy を指定します.
% echo DBIx::Class Catalyst::Controller::Atompub | perl cpan2pkg.pl # 標準入力 % perl cpan2pkg.pl module_list.txt # ファイル
すべて無事に終了すると,指定したモジュールとその依存モジュールの
.deb が /tmp/cpan2pkg/deb/ に作成されます.
Debian Etch でしかテストしていませんが,.deb を使っているディストリ
ビューションであれば使えると思います.
■ ダウンロードと注意事項
CodeRepos からダウンロードできます.
http://coderepos.org/share/browser/lang/perl/misc/cpan2pkg
人柱上等な人は以下の注意書きを読んだ上で使ってみてください.
- 作業ディレクトリは /tmp/cpan2pkg で決め打ちです./tmp/cpan2pkg/log
にログらしきものが出力されます.
- dh-make-perl を実行するときに sudo しています.本来,dh-make-perl
は root 権限不要なのですが,XML::SAX のように /usr 以下に書き込も
うとするモジュールがあるので,sudo しておくことにしました.このた
め,sudo を no password で使えるようにしておいたほうがよいです
(というか,スクリプトを root で実行した方がいいかも).
- ソースのダウンロードやモジュール名の確認のために,search.cpan.org
にかなりの回数アクセスします.
- 作成される .deb が依存するパッケージは perl のみとしています.こ
れは,.deb を作れないモジュールが存在しうるためです.
Cpan2Pkg::DebMaker->make 内のコメントを外せば,依存パッケージを設
定できるようになります.
個人的には今のバージョンで間にあっているのですが,sudo の有無や.deb
への依存パッケージ設定,出力ディレクトリをコマンドラインオプション
で指定できるようにしたいですね.あと,コアモジュールは .deb にしな
いのですが,CPAN でアップデートされてるときだけ .deb にするとかあ
るといいかも.
いろいろ気づいたら修正してコミットしてみてください m(_ _)m
■ 準備
cpan2pkg.pl を使う前に,以下の準備をしてください.
.deb の作成に dh-make-perl を使っていますので,あらかじめインストー
ルしておいてください.
% sudo apt-get install dh-make-perl
dh-make-perl v0.25 にはバグがあるので,/usr/share/dh-make-perl/ に
あるファイルに次のパッチを当ててください.
diff -bru usr/share/dh-make-perl.orig/rules.MakeMaker.noxs usr/share/dh-make-perl/rules.MakeMaker.noxs --- usr/share/dh-make-perl.orig/rules.MakeMaker.noxs 2008-03-26 14:02:47.000000000 +0900 +++ usr/share/dh-make-perl/rules.MakeMaker.noxs 2008-03-26 14:04:01.000000000 +0900 @@ -51,7 +51,7 @@ # As this is a architecture independent package, we are not # supposed to install stuff to /usr/lib. MakeMaker creates # the dirs, we delete them from the deb: - rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/lib/perl5 + [ ! -d $(TMP)/usr/lib/perl5 ] || rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/lib/perl5 touch install-stamp diff -bru usr/share/dh-make-perl.orig/rules.MakeMaker.xs usr/share/dh-make-perl/rules.MakeMaker.xs --- usr/share/dh-make-perl.orig/rules.MakeMaker.xs 2008-03-26 14:02:53.000000000 +0900 +++ usr/share/dh-make-perl/rules.MakeMaker.xs 2008-03-26 14:03:49.000000000 +0900 @@ -60,7 +60,7 @@ # As this is a architecture dependent package, we are not # supposed to install stuff to /usr/share. MakeMaker creates # the dirs, we delete them from the deb: - rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/share/perl5 + [ ! -d $(TMP)/usr/share/perl5 ] || rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/share/perl5 touch install-stamp
dh-make-perl のバグについて
Possible MBF: perl 5.10 and the "remove empty /usr/lib/perl5 dir" bug
(Google Cache) Possible MBF: perl 5.10 and the "remove empty /usr/lib/perl5 dir" bug
■ スクリプトの動作概要
スクリプトの動作を簡単に説明しておきます.
- まず,cpan -a (autobundle) で現在インストールされているモジュール
のバージョン一覧を取得します.
- 次に,search.cpan.org にアクセスして,指定したモジュールの正式名
称を解決し .tar.gz をダウンロードします.
- tar.gz を解凍して,META.yml から依存モジュールを読み取ります.
(Module::Depends を使用).なお,コアモジュールは無視します.
- すべての .tar.gz をダウンロードすると,.deb の作成にとりかかります
- dh-make-perl を使って .deb を作成します.ただし,dpkg (あるいは
apt) を使ってインストールされているモジュールは作成しません
(dpkg -l の出力から判定).
■ .deb 以外のパッケージ
Cpan2Pkg::DebMaker を真似して Cpan2Pkg::RpmMaker を作れば,.rpm を
作成することもできます.
