良いあそなすちゃん

良い方のあそなすちゃんです!

特定の環境で 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はやっぱ楽でいいですね。