middleman 4の外部パイプラインを必要そうなときだけ動かす

ちょっとした確認のたびに外部パイプラインが動くと、いちいち時間がかかるので、必要っぽいときだけ動くようにしてみる。

ep_output_dir = '.tmp/dist'
ep_input_dirs = [
  config[:css_dir] || 'stylesheets',
  config[:js_dir] || 'javascripts'
]
ep_input_glob = '**/*.{js,css,scss,sass}'

if build?
  ep_input_updated_at = ep_input_dirs.map do |dir|
    patt = File.join(config[:source], dir, ep_input_glob)
    Dir.glob(patt).map { |f| File.mtime(f) }.max
  end.max

  patt = File.join(ep_output_dir, '**/*')
  ep_output_updated_at = Dir.glob(patt).map { |f| File.mtime(f) }.min

  if ep_output_updated_at > ep_input_updated_at
    ep_command = 'echo "(Skip external pipeline)"'
  else
    ep_command = 'node_modules/.bin/webpack --bail'
  end

else
  ep_command = 'node_modules/.bin/webpack --watch -d'
end

activate :external_pipeline,
  name: :webpack,
  command: ep_command,
  source: ep_output_dir,
  latency: 1