特定の環境で bundle install したくないgemがあるとき
たとえば1つのリポジトリでWebサーバとAPIサーバを兼ねるコードを書いていて、Webサーバをheroku、APIサーバを自前のVPSに入れる、みたいな設計をしたときを想定する。 Webサーバでは使わないnative esxtentionがあったときにbuildpackなり依存ライブラリを入れたくないときにGemfileにこう書くといい感じになった
gem 'rails' #snip group :web do gem 'taglib-ruby' end
として Webサーバのデプロイ時の環境変数に BUNDLE_WITHOUT=development:test:web
としておくと、group :web
の中にあるgemはWebサーバにインストールされない
逆にAPIサーバのデプロイ時にはインストールされる。
所感
小さなアプリケーションなので、WebとAPIでリポジトリを分けると重複するコードが多かったのでひとつのコードベースで実現させた。 taglib-rubyはローカルのディスクにあるファイルを操作することが前提なのでherokuと相性が悪く今回はAPIという概念をつくって対処した。もちろんtaglib-rubyを使う以外のJSONを返すようなAPIとしての機能もある。 それにしても自分のVPSにアプリケーションをデプロイするのに1時間ぐらいかかって大変だった。herokuはやっぱ楽でいいですね。