Movable Typeの再構築の出力制御について

Movable Typeの再構築の出力制御について

Posted at May 1,2008 3:03 AM
Tag:[MovableType, Rebuild]

ご存知の方も多いと思いますが、Movable Type で再構築(スタティックパブリッシング)を行った時、指定したすべてのファイルは無条件に出力されない仕様になっています。

例えば、すべてのインデックステンプレートで、「再構築オプション」をチェックしている状態(4.15以降であれば「スタティック」を選択)で、再構築画面から「すべてのファイル」または「インデックスのみ」を指定して再構築した場合、スタイルシートやJavaScript(mt.js)を最近編集していないのであれば、それらのファイルのタイムスタンプは更新されません。

極端な条件にすると、ブログ記事やテンプレート、あるいはコメント・トラックバックなど、前回の再構築からブログの情報が全く変更されていない状態で、再構築画面から「すべてのファイル」を選択して再構築を行っても、ファイルはひとつも出力(更新)されません。

この仕様に、最近まで全く気がついていませんでした。
レンタルサーバやローカルPCのタイムスタンプを確認しましたので、おそらく間違いはないと思いますが、認識誤りがありましたらご指摘ください。

1.ファイルが出力される条件

再構築でファイルが出力される条件を示します。
ソースをトレースすれば明確な条件が分かると思いますが、時間がないので(というかトレース能力が低いので)再構築を実際に行って、確認した限りの内容です。

  • テンプレートを編集した場合
  • 変更した情報に関連するテンプレートタグがテンプレートに記述されている場合
  • 管理画面からファイルの出力内容に関係する設定の変更が行われた場合
  • 再構築対象のファイルがなくなっている場合

2.各条件の詳細

1番目の条件は自明ですが、テンプレートの内容に変更があった場合、対象のテンプレートを再構築することによってファイルが出力されます。

2番目の条件は、例えば、コメントを投稿(公開)したときに、「最近のコメント」といったコメント関連のテンプレートタグが存在するテンプレートだけが再構築対象になります。逆に、コメント関連のテンプレートタグが存在しないテンプレートは再構築対象になりません。

3番目の条件は、例えば、ブログ記事編集画面でコメント・トラックバックの受信設定を変更した場合、そのブログ記事の内容を変更していなくても、コメントフォームやトラックバックURLの表示が変わるため、保存によって再構築され、ファイルが出力されます。

4番目の条件は、テンプレートの変更や該当するテンプレートタグがなくても、ファイルが何らかの要因でなくなってしまった場合は再構築されます。これはパスやファイル名が変更されたときも同じと思われます。

3.ファイルを出力したい場合

プログラムをハックすれば出力できる手段があるはずですが(または環境変数)、管理画面上で簡単に全てのファイルを再構築するには、テンプレートで共通に呼び出しているテンプレートモジュールを適当に編集してから再構築するのが無難ではないでしょうか。

4.再構築の最適化

テンプレートタグの有無で再構築が制御できることが間違いないのであれば、部品を単純にインクルードするよりも、コメントやトラックバックなどの特定テンプレートタグをモジュール化することで、再構築時間はより短縮できると思います。
4.15のSSIを用いれば、独自にPHP化せずにそのようなことが実現可能かもしれません。

5.再構築の定義

ふと思ったのですが、画面上再構築は行われているのに、仮にファイルがひとつも出力されない場合は「再構築」という表現は正しいのでしょうか(単に素朴な疑問です)。

内部処理では再構築するためのチェックが行われていると思いますし、それを含めて再構築(処理)と定義するのかもしれませんが...。

一括再構築は別として、例えば、個別再構築の場合「前回から変更がなかったのでファイルは更新されませんでした」というメッセージ出力も可能な気がします。

すいません。ちょっと疲れてます。

関連記事
トラックバックURL


トラックバック

「再構築すれども上書きせず」とその理由 from The blog of H.Fujimoto
yujiroさんのブログ「小粋空間」で、「Movable Typeの再構築の出力制御について」という記事がアップされていました。この記事の補足をさせていた... [続きを読む]

Tracked on May 1, 2008 11:08 AM
コメント

私の場合はサーバーの仕様なのかダイナミックパブリッシングが出来ませんので、スタティックパブリッシングで再構築を行っていますが、最近は[プログ記事アーカイブのみ]でも1時間近くかかってしまうので、[全ての再構築]は恐怖です。

それでもカスタマイズなど手を入れた時は必ず必要になる再構築ですが、最初の頃は訳も分からず「全て」を選んでいました。

当然ちょっとした変更にも5分、10分かかるのが当たり前で、次第に再構築恐怖症のトラウマが…(^^ゞ。

で、最近はインデックステンプレートで分かるカスタマイズはインデックスだけ。
コメントや、その他インデックス(トップページ)では結果が分からない部分は、適当な記事を選んで[保存]だけしています。

すると前後の記事を含めて3つの記事が再構築され、新しい内容で書き出されますので、それを確認するように。

これに気がつくまで随分時間を無駄にしました。

スタティックパブリッシングで運営されている方、ちょっとしたカスタマイズは再構築ではなく、記事の保存が一番速い思います。

記事の本質とはちょっとズレてしまって申し訳ありません。

[1] Posted by aiko_m logo : May 1, 2008 4:44 AM

MTOS(4.1)だと

lib/MT/WeblogPublisher.pm の1493行目

return 1 unless $fmgr->content_is_updated( $file, \$html );

1729行目

next unless $fmgr->content_is_updated( $file, \$html );

の2行をコメントアウトでいけるように見えます。

この部分 (lib/MT/FileMgr/Local.pm の content_is_updated) の処理はファイルが存在する場合は「ファイルの内容」と「ファイルに吐き出されるデータ」を MD5のハッシュ値を生成して比較して、両者の値が一致しなければファイルを書き出すというチェックを行っているようです。

「強制的にファイルが吐き出されて欲しい」シチュエーションとは具体的にはどんなケースでしょうか?

[2] Posted by Junnama logo : May 1, 2008 5:58 PM

再構築とか構築とかパブリッシュとか公開とか、別に意味が定義されているわけではないです。実装がどうなっているかを元に意味を規定するのも意味のないことです。

不必要にファイルが生成されないのは、(1)タイムスタンプやinodeを変更すると、Last-Modifiedヘッダ・Etagヘッダが変わってしまい、条件付きGETが無効になるのを避けるため、(2)書き込み自体を減らすため、の二つの理由がありますね。

[3] Posted by ogawa logo : May 1, 2008 7:12 PM

>aiko_mさん
こんばんは。
コメントありがとうございます。
テンプレートタグをひとつのテンプレートで多く使っているとかなり時間がかかります。
ということで、例えば私のサイトでは再構築する単位を細かくモジュール分割して、Ajaxで読み込むようにしています。

>Junnamaさん
こんばんは。
ご指導ありがとうございました。
強制出力の件は、最近、画面を複数開いて色々なブログで実験しているのですが、正常に動作していないのか、実験ブログを間違えたのか、タイムスタンプで確認していた流れで書いただけです(次の執筆内容の確認で、連日夜中まで動作確認が続いて、とりあえず再構築されたファイルを知りたかったので)。
実運用でそうしたいという意味ではありません。誤解を招く表記ですいません。

>ogawaさん
こんばんは。
毎度のご指導、ありがとうございます。
条件付きGETの件はすっかり失念しておりました。

[4] Posted by yujiro logo : May 1, 2008 8:51 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)