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

例えば middleman build -e production

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

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

## 目的

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

“`prettyprinted
% middleman version
Middleman 3.3.6
“`

## ソースを修正する

### Fork する

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

> [DriftwoodJP/middleman](https://github.com/DriftwoodJP/middleman)

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

“`prettyprinted
% 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](https://github.com/middleman/middleman/blob/master/middleman-cli/lib/middleman-cli/build.rb#L12-15)

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

> [Thor – Home](http://whatisthor.com/)

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

“`ruby: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 しておきます。

“`prettyprinted
% git push origin build_option
“`

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

## github からインストールする

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

“`ruby: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](http://bundler.io/git.html)

`bundle update` します。

“`prettyprinted
% bundle update
“`

## config.rb を修正する

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

> [ruby で ARGV をうけるコマンドっぽいものを作ってみる | deadwood](https://www.d-wood.com/blog/2014/05/15_6221.html)

“`ruby: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 文の処理が行われるようになりました。

“`prettyprinted
% bundle exec middleman build -e production
“`
[/markdown]