Middlemanで「変更なし」「作成」「削除」「変更」の状態を取る


静的サイトジェネレーターのMiddlemanでサイトをビルドすると、ビルドされたファイル名が「変更なし」「作成した」「削除した」「変更した」といった状態変化とともに並びますよね。

ビルドしたファイルをS3に上げてウェブサイトとしてホストさせてたりすると、余計な通信を減らすためにもこの情報を有効活用したいものです。

公式サイトのドキュメントを見ていてもその方法は載っていないのですが、カスタム拡張を作ることで簡単にこれを取得できます。

この状態変化の情報は、ビルダーのon_build_eventというタイミングのコールバックで取得できます。このコールバックはカスタム拡張のbefore_buildメソッド内で設定できます。

class CatchChange < ::Middleman::Extension
  def before_build(builder)
    @mode = mode = Hash.new {|mode, event_type| mode[event_type] = []}

    builder.on_build_event do |event_type, target, extra|
      p event_type # => :identicalなど
      p target     # => #<Pathname:build/2015/11/06.amp.html>など、出力先のパス
      p extra      # => nil 「on_build_event」では常にnil

      case event_type
      when :identical
        # 変更なし
      when :created
        # 新規作成
      when :deleted
        # 削除
      when :updated
        # 内容の変更
      end

      # こうしておくとafter_buildなんかで@modeを参照することでこの情報を使える
      mode[event_type] << target
    end
  end
end

検索エンジンに情報を入れるために、更新したか否かを知りたくて調べてました。でも使わないことにしたので、コードに残らず、忘れてしまいそうなので残しておきます。ただ、アンドキュメンテドなので、予告なく変わったり無くなったりするかも知れません。