- 知り合いの所でリモートでOKアルバイト的にWebサービスの開発の仕事を行う
- 再来月から、インターン生として働きたいという人を対象にして、Rails開発の基礎を教える講座を行う。(ついでに教えた人をキャリアカウンセリングする)
という感じでRailsというのを軸にして「作る」→「教える」という状況をうまく創りだすことが出来たこともあり、手元のMacであれこれ環境作るよりは、Vagrantな環境で適宜それ用の環境整えることにしました。
ちなみに自宅の仕事場はこんな感じ
最近とてもお世話になってて、手放せなくなりつつあるパーフェクトRuby on Railsの8章の「Railsのインフラと運用」の章を参考に、VagrantでローカルにVMを作りつつ、そのVMに対してChefで構成管理しようと思ったら、いろいろハマったので、自分用にメモ
どんなことでハマったか?
以下のようにGemfileとか準備してchefとberkshelfの2つのgemをインストールしようとしたのですが、依存関係にあるNokogiriのインストールが
Building nokogiri using system libraries. Gem::Ext::BuildError: ERROR: Failed to build gem native extension. /Users/xxxx/.rbenv/versions/2.1.2/bin/ruby extconf.rb --use-system-libraries Building nokogiri using system libraries. libxml2 version 2.6.21 or later is required! *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. extconf failed, exit code 1 : : 省略 Gem files will remain installed in /Users/xxxxx/vagrant/vendor/bundle/ruby/2.1.0/gems/nokogiri-1.6.2.1 for inspection. Results logged to /Users/xxxxx/vagrant/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/nokogiri-1.6.2.1/gem_make.out An error occurred while installing nokogiri (1.6.2.1), and Bundler cannot continue. Make sure that `gem install nokogiri -v '1.6.2.1'` succeeds before bundling.
という感じで止まってしまいました
Gemfile
# A sample Gemfile source "https://rubygems.org" gem "chef" gem "berkshelf"
コマンド実行する
bundle install --path vendor/bundle
原因は
2010年の記事ですがgem管理の新標準ツール"Bundler"のTipsというのを見つけて
システムに同じgemが入っていたらそちらが使われる
たとえば、 $GEM_HOME に nokogiri が入っている場合、Gemfileにnokogiriを指定してbundle installしても、インストールはスキップされて、 $GEM_HOME のnokogiriが使われます。 これを回避する場合は、--disable-shared-gems オプションをつけましょう。 $ bundle install vendor/bundle --disable-shared-gems
というのを見つけました。
自分が使ってるbundleのバージョンは1.6.xで、disable-shared-gemsオプションっていうのが使えなかったのですが、なんとなくこの辺りの情報見てて、
- Nokogiriのインストールに失敗した際に、エラーメッセージ手がかりにgem install nokogiri -v '1.6.2.1を実行して、rbenv環境で利用されるgemとしてインストール済
- bundle install vendor/bundleした時に、$GEM_HOME に nokogiri が入っているためそっちの情報も見てしまってる
みたいなところが要因なのかなとふと思いました。
rbenv使ってるから、それ用のgemsetを作成して作業していたので、Bundler経由でしっかりとそっちにすべてインストールしてもらいたいなぁと思ったので、そういう設定ができるのかなとBundlerの公式サイト見てたら、bundle configというページにいきつきました。
で、そのBuild optionsで、mysql gemのインストールする時のパスの設定サンプルが出てて、これ見て、閃きました
bundle install 経由でNokogiriインストールする際に、参照してほしいパスが無視されてるっぽいから、上記情報を頼りに
bundle config build.nokogiri --with-iconv-dir=/usr/local/Cellar/libiconv/1.13.1 --with-xml2-include=$(brew --prefix libxml2)/include/libxml2
とした上で、
bundle install --path vendor/bundle
こんな↓感じでnokogiriのインストールが出来ました!
Installing nokogiri 1.6.2.1 Installing notifier 0.5.0 Installing rdiscount 2.1
それが出来たので、本来の目的だったChefのインストールも無事出来た!
ここ数日このトラブル(それ以外にも1つ)に悩んでいたので解決して良かった〜