[Middleman 3] middleman build にオプションをつける

例えば middleman build -e production

Version 4 からは正式に使えるようになるそうです。

教えて頂いた箇所を見ると、現在のバージョンでも同じ箇所に手を入れれば、目的が果たせそうなので調べてみました。

目的

middleman build -e production を実行すると、本番用に画像や CSS を minify する条件分岐を追加したい。

% middleman version
Middleman 3.3.6

ソースを修正する

Fork する

Middleman のソースを変更できるように fork します。

DriftwoodJP/middleman

git clone して、今回の作業用にトピックブランチを作っておきます。

% git clone git@github.com:DriftwoodJP/middleman.git
% cd middleman
% git checkout -b build_option
Switched to a new branch 'build_option'

該当箇所を修正する

教えて頂いたのはこのあたり。

https://github.com/middleman/middleman/blob/master/middleman-cli/lib/middleman-cli/build.rb#L12-15

どうも Thor を CLI として使っているよう。

Thor – Home

現在の v3.3.6 では middleman-core/lib/middleman-core/cli/build.rb が同等の処理を担っているようなので、該当箇所に同じ内容を追記しました。

middleman-core/lib/middleman-core/cli/build.rb
    desc 'build [options]', 'Builds the static site for deployment'
    method_option :environment,
                  aliases: '-e',
                  default: ENV['MM_ENV'] || ENV['RACK_ENV'] || 'development',
                  desc: 'The environment Middleman will run under'

Middleman を知っていればもっとうまい方法もあるかもしれませんが、これだけで ARGV で値をとれそうです。
middleman build -e foo もエラーなしで動くようになりました。

git push する

add, commit 実行後、Fork したリポジトリにトピックブランチを push しておきます。

% git push origin build_option

以上で下準備が完了です。

github からインストールする

Middleman のプロジェクトファイルに戻ります。
ソースを改変した branch を指定し、Fork した github のリポジトリからインストールするよう設定を変更します。

Gemfile
# gem 'middleman', '~> 3.3.6'
gem 'middleman', github: 'DriftwoodJP/middleman', branch: 'build_option'

Bundler: The best way to manage a Ruby application’s gems

bundle update します。

% bundle update

config.rb を修正する

config.rb で、オプション値を ARGV で受け取ります。

ruby で ARGV をうけるコマンドっぽいものを作ってみる | deadwood

config.rb
# Build-specific configuration
configure :build do
  # middleman build -e production
  if ARGV[2] == 'production'
    activate :gzip
    activate :minify_css
    activate :minify_javascript
  end
end

下記を実行すると、if 文の処理が行われるようになりました。

% bundle exec middleman build -e production