[Middleman 3] middleman build にオプションをつける
例えば middleman build -e production
Version 4 からは正式に使えるようになるそうです。
@DriftwoodJP v4用のコードから -e オプション用意されています。https://t.co/qx2LUjQ91i
— Yuya Matsushima (@yterajima) October 29, 2014
教えて頂いた箇所を見ると、現在のバージョンでも同じ箇所に手を入れれば、目的が果たせそうなので調べてみました。
## 目的
`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]