BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

Sass(SCSS)とかChefとか使う人はBundler使おうぜ

RubyGemsRubyのライブラリ配布のパッケージ管理システムですが、なんか最近では、SassとかChefとか、Rubyプログラマ以外の人が使いそうなツールがRubyGemsで配布されるケースが多くなってきました。Rubyとか絶対書かなそうなウェブデザイナがgem installとか打つ時代の到来です。

例えばウェブデザイナが話題のSassを使ってみようと方法をググってみると「Rubyをインストールして、gem install sassと打てば使えるよ!」とか出てくるわけです。たしかにそうなんだけど、それだとシステムワイドにインストールされてしまうので、プロジェクトごとにバージョンを固定することができません。「昔のプロジェクトの動作がいつのまにかおかしくなってる!あれってどのバージョン使ってたんだっけ??」みたいなトラブルを避けるためにも、Gemパッケージはプロジェクトごとに個別にインストールしたいし、あとで同じ環境を再現できるように使っているバージョンを明確にしておきたい。

そこで、いきなりgem installとか叩かずに、Bundlerという仕組みを使ってプロジェクトローカルにGemsをインストールするというのが、Rubyプログラマの流儀となっています。とても便利なので、SassとかChefとかでRubyデビューした方にもぜひ使ってみてください。

というわけで、とりあえずBundlerをインストールしましょう。これだけはシステムワイドにインストールするので、普通にgem install bundlerします。

# gem install bundler

では、Webサイトのプロジェクトを作って、ローカルにSassを導入してみましょう。適当にプロジェクト用のディレクトリを作って、その中にGemfileというファイルを作ります。内容は次のようにします。

source 'http://rubygems.org'
gem 'sass'

このファイルでは「このディレクトリのプロジェクトではこのGemを使っています」ということを宣言しています。それでは、ここで定義したGemsをインストールしましょう。プロジェクトのディレクトリに移動してから、次のようにします。ローカルへのインストールなので、一般ユーザー権限で実行すればok。

% bundle install --path vendor/bundle

--pathオプションでパッケージのインストール先を指定します。これを指定しないとシステムワイドに入ってしまうので、このように--pathでプロジェクトディレクトリ下を指定することが実質必須です。パス指定はどこでもいいんだけど、vendor/bundleはRuby on Railsの伝統です。

これでプロジェクトディレクトリ下の閉じた場所にSassがインストールされました。

ただしインストールされたGemパッケージのコマンドにはPATHが通っていないので、使用するにはbundle execをかませます。例えばsassコマンドを使うには、bundle exec sassとします。

% bundle exec sass --watch sass:css

あとはいつも通り。

ところで、最初にbundle installした時に、Gemfile.lockというファイルが作られています。ここにはインストールされたGemsのバージョンが記録されています。このファイルをプロジェクトに含めておけば、プロジェクトでどのバージョンのGemsが使われているのかが明確になります。Gitなどでバージョン管理する場合はGems(vendor/bundle)は含めなくてok。

Gembundler