mayona

プラグインのディレクトリ構成につきまして

0

プラグインについて勉強中です。
こちらの
http://www.movabletype.jp/documentation/developer/plugins/
「プラグイン開発者向けドキュメント」内にYAMLファイルの説明がありました。
しかし経験上、YAMLファイルがないものも多く、単に~.plのみのケースで配布しているもののあります。
また/lib/ディレクトリ内の~.pmといったファイルもあったりなかったりがあります。

その差といいますか、どういった際に使用して、どういった際に使用しないのでしょうか。
いろいろとプラグインを見回して、書き方やディレクトリ構成の勉強をしているところですが、
素人考えだと、無くて済むなら余計な事はしたくないと思いつつも、意味なくYAMLファイルやpmを置くわけがないと思うので、その真意を伺いたいです。
また、このあたりの解説がどこかにあれば、教えていただきたいです。

返信(11)

| 返信する
  • たしかに、プラグインを実現する際のコードの解説はありますが、ファイル配置についてはあまり触れられていない気がします。

    ということで、当ブログのエントリーで(分かる範囲で)解説したいと思います。エントリーしましたらこちらにコメント致します。

  • えーっと、まぁ、半分、気分みたいなものですが、仮にそうでも(?)無駄なファイルはありません。作り方によって、ファイルの数は増減します。順番に説明するとこんな感じになると思います。

    1. hoge.pl か config.yaml か
    私の場合、簡単なプラグイン、または加えて多少の処理(Perlプログラミング)で済むような場合であれば hoge.pl にして、hoge.pl の中に処理も書いてしまうため、プラグインは hoge.pl 単体になることが多いです。config.yaml でも簡単なプラグイン程度なら記述できますが、config.yaml 内には Perl コードを書けないため(多分)、それは他のファイルにして記述します。

    2. 多言語対応
    メッセージが日本語、英語などの多言語対応する場合、L10N.pm、ja.pm、en_us.pm などのファイルが必要になる場合があります。逆に言えば、多言語対応しないプラグインでは、これらのファイルは不要です。config.yaml では、config.yaml だけで多言語対応できます。

    3. tmpl/hogehoge.tmpl
    プラグインが設定画面を持つ場合などにあったりしますが、これも hoge.pl 内に記述できたりするので、無い場合もあります。

    4. lib/hoge/CMSなんちゃら.pm
    専用の設定画面などを持つ場合に、その処理を書きます。これも、hoge.pl に書くことができたりするので、無い場合もあります。

    大体、上のような感じでファイルが見つかると思います。hoge.pl に全部書いてしまうことも可能なのですが、複雑なプラグインの場合、hoge.pl が巨大になってメンテナンス性が悪くなるので、機能や処理単位でファイルに分けてプラグインを作るのが一般的です。その分け方はプラグイン作者の気分次第なところがあって、特に決まったやりかたはありません。別のファイルにしてもしなくても、同じ動作をするプラグインを作ることができます。

  • (1) YAML について
    各プラグインは、プラグインで拡張・強化する機能 (ロジック) とプラグインの登録に関するコードと整理できます。この登録に関する部分というのは MT->add_plugin($plugin); と $plugin を定義している部分です。従来の書き方では、この両方を xxxx.pl の中に記述していました。 MT4 からは、登録に関する部分を config.yaml で分離する方法にも対応しています。

    config.yaml を利用するメリットは、ロジックと登録を分離するだけでなく、テンプレートタグやコールバックを独立したモジュールとして記述することで、メンテナンス性が高いプラグインを開発できる点にあります。

    MT5 以前のテンプレートタグは、lib/MT/Template/ContextHandlers.pm に集約されていたのですが、MT5 では lib/MT/Template/Tags 以下に対象別のモジュールに分割されています。

    このように、モジュールを適切に分割することは、メンテナンス性を高めることにつながっていくわけです。

    (2) ディレクトリ構造
    単一ファイル xxxx.pl のプラグインは、プラグインの一覧画面で表示される概要も英語で表示されてしまうこともあり推奨していません。MT のディレクトリ構造にあわせて以下のように作成するのがよいと思います。

    /path/to/mt/plugins/PluginName/config.yaml
    /path/to/mt/plugins/PluginName/lib/PluginName/CMS.pm: 管理画面のカスタマイズに関するロジック
    /path/to/mt/plugins/PluginName/lib/PluginName/Tags.pm: テンプレートタグに関するロジック
    /path/to/mt/plugins/PluginName/lib/PluginName/Callbacks.pm: コールバックに関するロジック
    /path/to/mt/plugins/PluginName/lib/PluginName/L10N.pm: L10N に関するロジック
    /path/to/mt/plugins/PluginName/lib/PluginName/L10N/en_us.pm 英語辞書
    /path/to/mt/plugins/PluginName/lib/PluginName/L10N/ja.pm: 日本語辞書
    /path/to/mt/plugins/PluginName/tmpl/*: テンプレートファイル (プラグインの設定画面や管理画面のカスタマイズで利用)
    /path/to/mt/mt-static/plugins/PluginName/*: 画像やCSS、JS といったスタティックファイル

  • >mayonaさん
    エントリーしました。参考になれば幸いです。

    Movable Typeのプラグインファイル構成について
    http://www.koikikukan.com/archives/2010/11/06-020202.php

  • yujiroさんの記事ないのセキュリティに関する点と、ピロリーヌ・ド・マジク・ヴォクスさんのコメントにあったYAMLファイル内のperlコードの実行に関して記事を書きました。

    Re: Movable Typeのプラグインファイル構成について - blog.aklaswad.com

  • >aklaswadさん
    ご指摘ありがとうございます。
    テーマのtheme.yamlとプラグインのconfig.yamlの話を混同&config.yamlにコードが書けることを失念していました。
    記事は修正致しました。

  • 識者の方々、ご丁寧なアドバイスありがあとうございます!
    始めたばかりでわからないことが多いのですが「役割に応じたファイル/ディレクトリ構成にしておくのが後々良い」ということでディレクトリ構成に関わる感覚は掴めたような気がします。「マストではない」ということもわかってよかったです。
    といっても私のレベルでは分けるほどのコードになるわけもないので、取りあえず~.plにひとまとめして勉強していきます。(方法論としては間違ってないですよね)

    追加で質問させてください。
    例えば、グローバルモディアファイアを追加する場合は以下を使い、
    MT::Template::Context->add_global_filter(hogehoge => \&hogehoge_main);
    管理画面の投稿画面のカスタムは以下から
    'MT::App::CMS::template_source.edit_entry' => \&_edit_entry_hoge,
    というように、書き方のベース(作法)みたいなものが他プラグインを見ていると彼処に見られます。
    その流れでエントリーのタイトルやそのエントリーの所属カテゴリーを取得したいと思ったときに、
    「こういう書き方でこの属性を使います」的(MTタグでいうタグリファレンス的)な情報はどこから得れば良いのでしょうか。
    ご紹介いただいた書籍を購入するつもりではおるのですが、Perlの基礎知識同様、この辺も知っていないと話にならないのではと思い、お伺いしています。
    識者の方々は欲しい情報を得るのにどういうフローを介しているのでしょうか。

    • 私の経験談ですが、開発するプラグインに必要な処理は、それに似たような動作を行うプラグインやMTのソースコードを参考にしていました。それとは別に、一番最初のプラグインを作ったとき、藤本壱さんの「ブログ自由自在 Movable Type 上級カスタマイズ術」という本が非常に参考になったのを覚えてます。

      ブログ記事のタイトルを取得するといった、オブジェクトへのアクセスなどについては、MT3のものですが以下が参考になります。

      Movable Type オブジェクト・リファレンス
      http://www.sixapart.jp/movabletype/manual/object_reference/

      例えばブログ記事オブジェクトについては「MT::Entry」が対応します。

  • ありがとうございます!
    一歩目がいっしょで安心しました。
    皆様のアドバイスを参考に頑張ります。

  • 皆様から頂いたコメントを一部ドキュメントに反映させていただきました。網羅できていない部分については連載に追う形で解説をさせて頂きます。

    改めまして、ご指摘ありがとうございました。

返信する


カテゴリグループ

OpenID対応しています OpenIDについて