CPANモジュールをスクリプト一発で依存解決しつつrpm化する (original) (raw)

少し前にmizzyさんに

そういえば、まっさらなサーバを30分で本番投入できるようにする で stanaka さんが「CPANの依存関係を解析してrpm化する手製スクリプトで、CPANモジュールのrpm化が、ほぼ自動化されています」と書いてるんだけど、これって公開してくれないのかなー。

HowToRpmizeCpanModules - mizzy.org - Trac

と突かれたので、githubで公開してみます。

http://github.com/stanaka/cpan-dependency/tree/master

突かれたついでにmizzyさんに軽く動作確認してもらったところ、それなりに動いているようです。また、はてなでは、このスクリプトを利用して、日々それなりの数のCPANモジュールのrpm化を行っていますので、だいたいうまく動くのではないかと思います。

CentOSFedoraなどのRedhat系ディストリを使っているPerl使いの方は、是非、使ってみてください。

使い方

以下のツール・CPANモジュールをインストールしておいてください。

githubからクローンして、実行します。ここでは、Linux::Smapsをrpm化します。

git clone git://github.com/stanaka/cpan-dependency.git cd cpan-dependency bin/cpan-dependency.pl --conf=config/conf.yml Linux::Smaps

依存関係の解決が手抜きアルゴリズムですので、けっこう時間がかかりますので、ご注意下さい。minicpanあたりでCPANのローカルミラーを作っておいたがほうがいいと思います。

また、アーカイブがtar.gz前提だったりしますので、tar.bz2やzipで圧縮されたアーカイブのCPANモジュールは正しくrpm化できません。その時は中間生成物のspecファイルを直接触ってください。このあたりは気が向いたら、直します。

できたrpmファイルは、適当なディレクトリに集積させて、createrepoでyumリポジトリにすると、yumコマンド一発でインストールできるようになって、より良いと思います。createrepoは「createrepo」を検索 - はてなブックマークあたりを参考にしてください。

設定ファイル

CPANモジュールはMETA.ymlで依存関係を記述するようになっているのですが、常に必要十分なものが書かれているとは限りません。なので、後付けて設定ファイルによって依存関係を補正します。バッドノウハウの塊のようなものですね。

設定ファイルは、以下のようなYAMLフォーマットとなっています。

Log-Log4perl: requires: Log::Dispatch::File: 1 Log::Dispatch::FileRotate: 1 Log::Dispatch::Syslog: 1 Log::Dispatch::Screen: 1 IPC::Shareable: 1 filter_requires: RRDs: 1 Test-HTTP: build_requires: Class::Field: 1 mod_perl: build_skip: 1

これは、

ということを意味しています。

このあたりをガリガリ書いていくことで、スムーズにrpm化ができるようになります。スクリプト一発といいつつ、多少手間がかかるのですが、現実はそんなものです。

追記

そういえば、もともとGentooユーザなので、Gentooに用意されているg-cpan.plという素晴らしいスクリプトのrpm版が欲しかった、というのがモチベーションになっています。