--pathつきでbundleしたときのGemfile内でrequireすると指定したpathからロードしようとしてくる

背景

やんごとなき事情によりGemfile内で色々することになり*1そのためのgemを作って使うことになった。 ローカルではうまくいったけどCI環境にいれてみるとどーもうまくいかない。

事象その1

状況

# Gemfile

source "https://rubygems.org"

require 'awesome_gem'
$ bundle
# 詳細わすれたけどそんなgemねえ系のエラー

解決策

先にグローバルにgem installしておけばいいんじゃね?

$ gem install awsome_gem
$ bundle
# => OK

事象その2

状況

Gemfileは同じ。

$ gem install awsome_gem
$ bundle install --path vendor/bundle
# 詳細わすれたけどそんなgemねえ系のエラー

--path を指定するとまたもrequireでコケる
これはなぜかというと、--path オプションを指定した場合、Gemfileを読み込む時点でrequireでロードするパスがオプションの値になってるっぽい。 だからグローバルにインストールしておいてもそれをrequireしてくることができない

解決策

$ mkdir tmp
$ cd tmp
$ echo <<EOS > Gemfile
source "https://rubygems.org"
gem 'awesome_gem'
EOS
$ bundle install --path ../vendor/bundle
$ cd ../
$ rm -rf tmp
$ bundle install --path vendor/bundle

要は別Gemfileでvendor/bundleに突っ込んでおけばよい。


こんなことでハマる人、たぶんそうそういないと思うけどメモ。

*1:いいプラクティスではない気がしている