細かきこと

書いたり書かなかったり

rbenvとrbenv-gemsetでgemをよろしく管理する

同じgemでもアプリによって依存するバージョンが違ったりする場合やちょっと試したい場合に、rbenv-gemsetをつかって、gemsetを分けておくと便利。

例えば、bundlerとかpryとか共通に使うgemは、globalと名付けたgemsetにして、railsとかsinatraとかのgemはアプリごとにgemsetを作るとはかどる。

まず下のようにglobalなgemsetを作る。 当然ながら、gemsetはrubyのバージョンごとに作る決まり。

$ rbenv gemset create 2.0.0-p247 global

作ったgemsetを確認

$ rbenv gemset list
2.0.0-p247:
  global

現在有効なgemsetを確認する

$ rbenv gemset active 
global

globalが印字されれば,上で作ったglobal用のgemsetが有効となっているので、bundlerとかをインストールすればよいと。

次にアプリ用のgemsetをつくり、存在するgemsetを確認。

$ rbenv gemset create 2.0.0-p247 example
reated example for 2.0.0-p247
$ rbenv gemset list
2.0.0-p247:
  example
  global

でもこの時点でactiveなのはglobalのみである。

$ rbenv gemset active 
global

共通用途として作ったglobal gemsetとアプリ固有の者として作ったexample gemsetの両方を使うようにするためには、アプリのルートディレクトリに.rbenv-gemsetsファイルを作り、そのなかに「exmaple global」と記載すればOK。 そうすることで、exampleディレクトリにいるときだけexample gemsetが有効になる。

$ cd example/
$  echo example global > .rbenv-gemsets
$ cat .rbenv-gemsets 
example global
$ rbenv gemset active 
example global

gem envで確認するとexample,globalがGEM PATHSに設定されている。

- GEM PATHS:
     - /Users/hoge/.rbenv/versions/2.0.0-p247/gemsets/example
     - /Users/hoge/.rbenv/versions/2.0.0-p247/gemsets/global

gemをinstallするとexmaple gemsetにinstallされ、globalを汚さない。

$ bundle init
Writing new Gemfile to /Users/salza/Documents/ruby-works/example/Gemfile
$ echo gem \"mechanize\" >> Gemfile 
$ cat Gemfile 
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem "mechanize"
$ bundle install
Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Installing unf_ext (0.0.6) 
Installing unf (0.1.2) 
Installing domain_name (0.5.13) 
Installing http-cookie (1.0.1) 
Installing mime-types (1.25) 
Installing net-http-digest_auth (1.4) 
Installing net-http-persistent (2.9) 
Installing mini_portile (0.5.1) 
Installing nokogiri (1.6.0) 
Installing ntlm-http (0.1.1) 
Installing webrobots (0.1.1) 
Installing mechanize (2.7.2) 
Using bundler (1.3.5) 
$ gem list -l

*** LOCAL GEMS ***

bigdecimal (1.2.0)
bundler (1.3.5)
coderay (1.0.9)
domain_name (0.5.13)
http-cookie (1.0.1)
io-console (0.4.2)
json (1.7.7)
mechanize (2.7.2)
method_source (0.8.2)
mime-types (1.25)
mini_portile (0.5.1)
minitest (4.3.2)
net-http-digest_auth (1.4)
net-http-persistent (2.9)
nokogiri (1.6.0)
ntlm-http (0.1.1)
pry (0.9.12.2)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
slop (3.4.6)
test-unit (2.0.0.0)
unf (0.1.2)
unf_ext (0.0.6)
webrobots (0.1.1)

でexampleディレクトリの外でgemの状態を確認すると、globalを汚してないことが確認できる。

$ cd ..
$ gem list -l

*** LOCAL GEMS ***

bigdecimal (1.2.0)
bundler (1.3.5)
coderay (1.0.9)
io-console (0.4.2)
json (1.7.7)
method_source (0.8.2)
minitest (4.3.2)
pry (0.9.12.2)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
slop (3.4.6)
test-unit (2.0.0.0)

という感じに便利だなと。