それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

nokogiriがインストール出来ないとかいう定番のアレ Mac OSX 10.11.1

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 ですねー

大好きなgccがなくてLLVMです。

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を使ってると切り分けが面倒なので、出来る限り初期のクリーン・インストール済み環境に近づけた。

f:id:takuya_1st:20151207110034p:plain:w300

で、ほぼ素のbashでターミナルを起動しておく。

ここままでで、最低限必要な物だけを戻しておく

brew link ruby-build rbenv
無い
  • /usr/local/bin/{bin,lib} | brew unlink でbrew 関係はすべてリンクから消した
  • ~/.gems | bashrcを無効にして、gem ,ruby_lib もまっさらに
  • ~/.rbenv | こちらも退避した
ある
  • /usr/local/bin/brew
  • /usr/local/bin/rbenv
  • /usr/local/bin/ruby-build

最低限を残しbrewもほぼ初期状態。

面倒だったら新規ユーザーでどうぞ

無味乾燥な環境を作った

f:id:takuya_1st:20151207110103p:plain:w300

ほぼ素の状態の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がインストール出来ないとかいう定番のアレは、brewgcc 関連や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