Bugzilla 3.6 での新しい拡張機構

注: 以下は、mkanatによるサマリーのメールの日本語版です。

Bugzillaの拡張システムがmkanatを中心として書き換えられました。
古い拡張システムには、以下のようなそれなりに大規模な拡張を入れる際に問題となる(なった)点がありました。

  • テンプレートフックは、コードからでは説明しにくい配置場所にありました。(template/en/hook なのか、template/en/default/hook なのか、template/en/extension なのか?)
  • コードは独立の.plファイルで毎回実行時にコンパイルされ、かつサブルーチンをかけませんでした。(同じリクエスト内で複数回フックを呼び出した時に、Bugzilla が再定義警告を出しました。)

ほかにもいろいろな点がありましたが、この二つが大きな問題点でした。

新しい機構ではよりよくなっています。ドキュメントは新しく作成された Bugzilla::Extension モジュールの POD ファイル にあります。
ハイライトは、以下のようになります。

  • 拡張のディレクトリの中にテンプレート、ライブラリ、そして Config.pm と Extension.pm の二つのファイルがあります。
    Config.pm は拡張が必要とする情報を持ちます。Extension.pm は拡張が提供する機能をサブルーチンとしてすべて実装しています。
  • “Foo” という名前のコードフックのみのものは、extensions/Foo.pm のように拡張はひとつのファイルにもできます。
  • “Foo” という名前の拡張のモジュール名は Bugzilla:Extension::Foo のようになります。
  • 拡張は Bugzilla::Extension::Foo::Bar といったライブラリを読み込みます。
    開発者が何もしなくても、拡張システムはこれを extensions/Foo/lib/Bar.pm にマップします。
    Bugzilla::Extension::Foo パッケージが読み込まれると、必要なら “use Bugzilla::Extension::Foo::Bar;” とすることで Bugzilla のどこからでも Bugzilla::Extension::Foo::Bar を直接利用できる用になします。
    これは、同時に、ライブラリを Perl グローバルに (/usr/lib/perl5/ の中の Bugzilla/Extension/Foo/Bar.pm として) 導入することもでき、利用できるということです。

    注: 古い @INC を利用した拡張の動作はなくなりました。必ず名前を Bugzilla::Extension::Foo::Bar にする必要があります。
    (過去の Foo::Bar と extensions::foo::lib::Bar が入り混じった状態よりかなりよい構造です。)

  • テンプレートでのフックは template/en/default/hook になります。拡張のディレクトリ (extensions/Foo/template/en/default/hook) と Bugzilla 標準のテンプレートディレクトリのどちらでも大丈夫です。
    フックを含む拡張のテンプレートは checksetup.pl によりコンパイルされます。また、テンプレートフックは初回起動時に Bugzilla によりキャッシュされ、通常のテンプレートの実行とほとんど同程度 (か少し早いくらい) になります。
  • 新しい拡張作者向けに、extensions/create.pl が提供されます。
    ひとつの引数として、拡張名を入れると拡張で必要なすべてのディレクトリを extensions/名前/ に作ります。
  • Perl グローバルにインストールされており、extensions/ ディレクトリにない拡張を読み込むこともサポートされます。
    これは、拡張がパッケージ化され CPAN 経由で配布されることが可能になっており、Bugzilla そのものにこれを可能にする機構が組み込まれたということです。
    (CPAN パッケージに拡張を簡単にまとめるためのコードはありませんが、行われる可能性はあります)
  • mod_perl 環境下では、拡張コードはサーバ起動の一度のみコンパイルされます。これは拡張が mod_perl 下でも高速に動作することとなります。
    (新規拡張を追加するためには、サーバを再起動する必要があるということでもあります。)
  • 既存拡張の作者のために、contrib/extension-convert.pl というファイルがあり、3.6 以前の形式から 3.6 の形式に書き換える作業のかなりのところを行えます。

これらによって拡張機構がかなりよくなってますし、今後もよりよくなっていくと思います。
新しい拡張の気候で何か問題があれば、もしくは改良点があれば、お知らせください。
拡張作者からの意見を聞きたいと考えております。

Leave a Reply »