nokogiri のインストールに失敗するというミス
これが有名なNokogiri地獄だ!まさか自分がハマるとは思わなかったですね。
Nokogiriとかいう多くのRubyGems ライブラリで使われるものがインストール出来なくて詰むという。
とっても悲しい事象が発生しました。
rails, mechanize → nokogiri 依存 → mini_portile2 依存 で詰む。何処でコケたか考えることすら面倒な感じです
解決方法は「ググらない?」
ググッても、「私はコレでできました」「ウチではこのコンパイルオプションで動きました」とか皆行ってることがバラバラなんですね。nokogiri のインストール出来ませんのブログも、 homebrew も rbenv も入ってるのか、Xcodeのバージョンも記載が無かったり闇を感じる。2時間ほど検索して時間を無駄にした。来年OSX 10.12(OSXi 11 )の自分のためにメモっておく。
nokogiriのインストールは
今日のnokogiriはいくつか改善されている。
OSX の標準添付のruby ( /usr/bin/ruby ) を使う限りでは、次の通りで簡単にインストール出来る
sudo /usr/bin/gem install nokogiri -- --use-system-libararies
若しくはinstall_dir を指定して自分のgem環境にnokogiriを入れられる。
mkdir ~/.lib/ruby /usr/bin/gem install --install-dir ~/.lib/gems nokogiri -- --use-system-libararies
随分と楽になったね。でも私は、homebre+rbenv+ruby-build環境なんだ。
OSX にnokogiriを入れなおしたのでメモを取る。
- 環境の確認
- homebrew の確認
- rbenv の確認
- 環境をOSX標準に近づける
- libxml2 の確認
- rbenv で新規環境
- nokogiri インストール
この順番で処理をしていった。
OSXの環境の確認
まずはじめに、OSXの環境の確認。今の私のOSXは最新バージョンに自動アップデートされている。
takuya@~/Desktop$ sw_vers ProductName: Mac OS X ProductVersion: 10.11.1 BuildVersion: 15B42
ビルド環境の確認
次にビルド環境の確認をしておく。
takuya@~/Desktop$ brew --config HOMEBREW_VERSION: 0.9.5 ORIGIN: https://github.com/Homebrew/homebrew.git HEAD: ae6c42c7eacf5196e83098658b795c883b9d9a87 Last commit: 9 hours ago HOMEBREW_PREFIX: /usr/local HOMEBREW_REPOSITORY: /usr/local HOMEBREW_CELLAR: /usr/local/Cellar HOMEBREW_BOTTLE_DOMAIN: https://homebrew.bintray.com CPU: quad-core 64-bit haswell OS X: 10.11.1-x86_64 Xcode: 7.1.1 CLT: N/A Clang: 7.0 build 700 X11: 2.7.8 => /opt/X11 System Ruby: 2.0.0-p645 Perl: /usr/bin/perl Python: /usr/local/bin/python => /usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/bin/python2.7 Ruby: /usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby Java: 1.8.0_31, 1.8.0_25, 1.7.0_75, 1.6.0_65-b14-468
Xcode が7.11 ですねー
rbenv の確認
念のためrbenvも確認しておきます。
takuya@~/Desktop$ rbenv --version
rbenv 0.4.0
-環境をOSX標準に近づける
nokogiriのメンテナーがコンパイルチェックしてるだろう標準環境に戻します。
OSXの標準のつもりな私の環境も、もしかしたらおかしくなってるかもしれない。
brew の一旦退避する。
homebrew や rbenv が入ってると、ミスがわからないので全部を片付けておきます。後で戻すけど
brew list | xargs -P5 -I@ brew unlink @
これで /usr/local/{bin,lib,include,opt} をほぼ空っぽにしてしてく。
brew コマンドだけ必要であとはいらない。
さらに、念のため、独自設定だらけのbashrcも退避しておいた。
私の場合、bashrcに.gemsフォルダ参照や、alias rubyだのrbenv ショートカット設定だのが多く入ってるので邪魔になりました。普通はやらないでいいとおもう。
mv ~/.bashrc ~/.bashrc.bak
さらに、ログインシェルを標準/bin/bashにする。
zsh や /usr/local/bin/bashを使ってると切り分けが面倒なので、出来る限り初期のクリーン・インストール済み環境に近づけた。
で、ほぼ素のbashでターミナルを起動しておく。
ここままでで、最低限必要な物だけを戻しておく
brew link ruby-build rbenv
無い
- /usr/local/bin/{bin,lib} | brew unlink でbrew 関係はすべてリンクから消した
- ~/.gems | bashrcを無効にして、gem ,ruby_lib もまっさらに
- ~/.rbenv | こちらも退避した
ある
最低限を残しbrewもほぼ初期状態。
面倒だったら新規ユーザーでどうぞ
無味乾燥な環境を作った
ほぼ素の状態のbashでターミナルを使うことにした。これで余計なことに神経を使わなくて済む。
おもむろに、nokogiri (system-ruby)の ビルドを試してみる。
ほぼ、素の状態なのでOSXのsystem ruby で nokogiriを入れてみる
gem install だけだとPermission エラーになるので自分のホームディレクトリにコンパイルして格納
gem install nokogiri --install-dir ~/.lib/gems --verbose -- --use-system-libaries
これで、まず問題なく動くことがわかる。
余計なものは一切ない。nokogiriの製作者が意図した環境でメンテナーがテストした環境になってると思う。
とりあえず、rbenvを作ってみる。
私の環境ではrbenvもコケてたので入れなおしてみる。 2.2.x 系はすでに動いているので、とりあえず2.1.x系で実験
RUBY_BUILD_CACHE_PATH=/tmp rbenv install -v 2.1.7 (ry Installed ruby-2.1.7 to /Users/takuya/.rbenv/versions/2.1.7
無事インストールが動き出した。
brew のリンクを元に戻す
ここままでで、環境の確認が出来たので、おもむろにbrew linkを戻して環境を整理しておく。
brew list | xargs -P5 -I@ brew link @
libxml系をリンクする
あとで必要になるので、libxml2 の最新版を入れておく
brew install libxml2 libxslt brew --force libxml2 libxslt
libxmlのバージョン確認
libxml2 をリンクした状態でバージョン確認をしたらこんな感じ
takuya@~$ xml2-config --version 2.9.2 takuya@~$ xslt-config --version 1.1.28 takuya@~$ which xml2-config /usr/bin/xml2-config takuya@~$ which xslt-config /usr/bin/xslt-config
最新版の nokogiri 1.6.7 で必要になるみたい
rbenv を作る
rbenv をターゲット環境で作ってみる。
RUBY_BUILD_CACHE_PATH=/tmp rbenv install -v 2.2.3 (ry Installed ruby-2.1.7 to /Users/takuya/.rbenv/versions/2.2.3
で、rbenv 経由で ruby 2.2.3 を有効に
rbenv global 2.2.3
nokogiri (rbenv 2.2.3)をインストールしてみる。
で、やっとここまで到達。ruby 2.2.3 (rbenv) に nokogiri 1.6.7 を入れる
gem install nokogiri --verbose -- --with-xml2-dir=`brew --prefix libxml2` --with-xslt-dir=`brew --prefix libxslt` (ry /Users/takuya/.rbenv/versions/2.2.3/bin/nokogiri Successfully installed nokogiri-1.6.7 Parsing documentation for nokogiri-1.6.7 Parsing sources... 100% [179/179] suppressions/README.txt Done installing documentation for nokogiri after 3 seconds 1 gem installed
お疲れ様でした!!!!
takuya@~$ rbenv exec nokogiri -v # Nokogiri (1.6.7) --- warnings: [] nokogiri: 1.6.7 ruby: version: 2.2.3 platform: x86_64-darwin15 description: ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15] engine: ruby libxml: binding: extension source: packaged libxml2_path: "/Users/takuya/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.7/ports/x86_64-apple-darwin15.0.0/libxml2/2.9.2" libxslt_path: "/Users/takuya/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.7/ports/x86_64-apple-darwin15.0.0/libxslt/1.1.28" libxml2_patches: - 0001-Revert-Missing-initialization-for-the-catalog-module.patch - 0002-Fix-missing-entities-after-CVE-2014-3660-fix.patch - 0003-Stop-parsing-on-entities-boundaries-errors.patch - 0004-Cleanup-conditional-section-error-handling.patch - 0005-CVE-2015-1819-Enforce-the-reader-to-run-in-constant-.patch - 0006-Another-variation-of-overflow-in-Conditional-section.patch - 0007-Fix-an-error-in-previous-Conditional-section-patch.patch - 0008-CVE-2015-8035-Fix-XZ-compression-support-loop.patch - 0009-Updated-config.guess.patch - 0010-Fix-parsering-short-unclosed-comment-uninitialized-access.patch libxslt_patches: - 0001-Adding-doc-update-related-to-1.1.28.patch - 0002-Fix-a-couple-of-places-where-f-printf-parameters-wer.patch - 0003-Initialize-pseudo-random-number-generator-with-curre.patch - 0004-EXSLT-function-str-replace-is-broken-as-is.patch - 0006-Fix-str-padding-to-work-with-UTF-8-strings.patch - 0007-Separate-function-for-predicate-matching-in-patterns.patch - 0008-Fix-direct-pattern-matching.patch - 0009-Fix-certain-patterns-with-predicates.patch - 0010-Fix-handling-of-UTF-8-strings-in-EXSLT-crypto-module.patch - 0013-Memory-leak-in-xsltCompileIdKeyPattern-error-path.patch - 0014-Fix-for-bug-436589.patch - 0015-Fix-mkdir-for-mingw.patch - 0016-Fix-for-type-confusion-in-preprocessing-attributes.patch - 0017-Updated-config.guess.patch compiled: 2.9.2 loaded: 2.9.2
じゃ、bundle も行ってみよう
echo gem "mechanize" , "=2.7.3" >> Gemfile bundle install
出来た
疲れた・・・
少し疲れました。
とりあえず、Nokogiriがインストール出来ないとかいう定番のアレは、brew の gcc 関連やgnu コマンド関連がPathに含まれててバッティングしていたということが分かった。
bundle するときは bundle config を使うといい。
いまのnokogiriをインストールしてみた感じだと、殆どの人は bundle install でコケることはないんだろうな。
bundle exec gem install nokogiri
または、直接ビルドオプションを指定する。
bundle config build.nokogiri -- --with-xml2-dir=`brew --prefix libxml2` --with-xslt-dir=`brew --prefix libxslt` bundle install