読者です 読者をやめる 読者になる 読者になる

TitaniumMobile勉強記

Web系エンジニア向けのキャリアアドバイザーやってましたが現在はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連(Node.js、Titanium)あたり

MacのMavericks+rbenv+bundlerでChefというかNokogiriの環境構築にはまった

ruby 環境構築
  • 知り合いの所でリモートでOKアルバイト的にWebサービスの開発の仕事を行う
  • 再来月から、インターン生として働きたいという人を対象にして、Rails開発の基礎を教える講座を行う。(ついでに教えた人をキャリアカウンセリングする)

という感じでRailsというのを軸にして「作る」→「教える」という状況をうまく創りだすことが出来たこともあり、手元のMacであれこれ環境作るよりは、Vagrantな環境で適宜それ用の環境整えることにしました。

ちなみに自宅の仕事場はこんな感じ

f:id:h5y1m141:20140627110848j:plain

最近とてもお世話になってて、手放せなくなりつつあるパーフェクト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つ)に悩んでいたので解決して良かった〜

パーフェクト Ruby on Rails
すがわら まさのり 前島 真一 近藤 宇智朗 橋立 友宏
技術評論社
売り上げランキング: 2,722