個人のいくつかのリポジトリで bundle install できないことがあり、困っ
ていました。
$ bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching version metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 11.3.0
Using concurrent-ruby 1.0.2
Using i18n 0.7.0
Using thread_safe 0.3.5
Using net-ssh 3.2.0
Installing minitest 5.10.1
Your Gemfile.lock is corrupt. The following gem is missing from the DEPENDENCIES section: 'ffi'
出るリポジトリと出ないリポジトリがあるんだよね...。bundler を 1.10.6 まで下げると再現しなくなるが、別の問題も出たりするのである意味詰む https://t.co/EbIQ36g1HY
— マスタカ (@masutaka) November 23, 2016
結論から言うと $ bundle install --without development
で回避できま
した(当該リポジトリでは development group は使っていなかった)。
今回は Gemfile に gem ‘ffi’ を追加して回避できました。bundler は最
新の v1.13.6 です。
情報にまとまりがなくて調べていくのが大変でした。1.10.6 に戻すと回
避できる
という情報もあったけど、さすがに古すぎだし…。
まだ根本解決はしていないようです。
Bundle install –deployment fails with Gemfile.lock is corrupt · Issue #5044 · bundler/bundler
追記(2016-12-10):
全然違っていたので、直しました。
今回のケースでは Gemfile に gem ‘pushover’ が書かれており、この行
をコメントアウトすると再現しないことがわかりました。
さらに調べると pushover の依存でインストールされる sys-proctable
を Gemfile に追加するだけで再現することがわかりました。
sys-proctable は require ‘ffi’ しています。
試しに Gemfile に gem
‘ffi’ を追加したら回避できたというわけです。
あとで分かるように Gemfile にはこのように書きました。
gem 'ffi' # workaround https://masutaka.net/chalow/2016-12-10-1.html
もう少し調べてみると、sys-proctable を最新の 1.1.3 から 0.9.9 に落
としたら、再現しなくなることがわかりました。
1.1.0 から OSX は C Extention から ffi
への依存に変更されたようで
す。ffi は Ruby から C の関数を呼べる Gem のようです。
https://github.com/djberg96/sys-proctable/compare/sys-proctable-0.9.9...sys-proctable-1.1.0
Rakefile で spec.add_dependency(‘ffi’) を追加しているので、大丈夫
なはずが、bundler の不具合で依存がうまくいかないのかもしれません。