Fix
- Bundle install (gets Nokogiri files)
- Browse to
ruby_dir\lib\ruby\gems\2.2.0\gems\nokogiri-1.6.6.2\ext\nokogiri
- Open
extconf.rb
- Add
dir_config('iconv').any? or pkg_config('libiconv')
to #376
- Download
MinGW64
& MSYS
folders from Mega
- Add them to
PATH
in Windows (remove Devkit
path refs - it doesn't work)
- Download
libxml2
,libxslt
, iconv
libraries (or here)
- Run
ruby extconf.rb --platform=ruby --n --use-system-libraries
referencing downloaded libraries
- Run
make
- Run
make install
Steps
Bundle Install
First step is to bundle.
This will put the nokogiri
gem on your machine without running the pre-packaged compiler (which mostly doesn't work in Windows).
This will show Nokogiri as installed:
Browse
Browse to the nokogiri
folder, to find ext/nokogiri/extconf.rb
:
Open extconf.rb
... and add dir_config('iconv').any? or pkg_config('libiconv')
to #376
Standard Nokogiri installs "rely" on the libxml2
inclusion of iconv
- we need to explicitly define it, otherwise iconv.h is missing
errors will occur.
Add Toolchain
Don't use devkit
for this - it doesn't work.
You need MinGW
:
I have zipped my exact MinGW64
and MSYS64
folders on Mega (key: !FJtcq25l-QMsNltCxllMhc1IGqORvap8xv8gWxSUbDA
):
Add to PATH
This gives access to gcc
& make
(both required):
Remove the devkit
ref from your path, and add the following:
- MINGW64_PATH/bin
- MSYS64_PATH/bin
Download Libs
I have added the libs to Mega:
You will unzip them here:
All the libs are from this source.
Run extconf.rb
Once libs are on your system, you can run ruby extconf.rb
to configure the build:
32bit
ruby extconf.rb --platform=ruby -N -- --use-system-libraries --with-xml2-dir=C:/Dev/Dependencies/Ruby/lib/nokogiri/32bit/libxml2-2.9.2-win32-x86 --with-xml2-include=C:/Dev/Dependencies/Ruby/lib/nokogiri/32bit/libxml2-2.9.2-win32-x86/include/libxml2 --with-iconv-dir=C:/Dev/Dependencies/Ruby/lib/nokogiri/32bit/iconv-1.14-win32-x86 --with-xslt-dir=C:/Dev/Dependencies/Ruby/lib/nokogiri/32bit/libxslt-1.1.28-win32-x86
64bit
#64
ruby extconf.rb --platform=ruby -N -- --use-system-libraries --with-xml2-dir=C:/Dev/Dependencies/Ruby/lib/nokogiri/64bit/libxml2-2.9.2-win32-x86_64 --with-xml2-include=C:/Dev/Dependencies/Ruby/lib/nokogiri/64bit/libxml2-2.9.2-win32-x86_64/include/libxml2 --with-iconv-dir=C:/Dev/Dependencies/Ruby/lib/nokogiri/64bit/iconv-1.14-win32-x86_64 --with-xslt-dir=C:/Dev/Dependencies/Ruby/lib/nokogiri/64bit/libxslt-1.1.28-win32-x86_64
make
This may create errors / warnings, as long as it says "Error 1 (ignored)
", it should be okay.
Following that, use make install
:
Then browse to your Rails installation and run rails s
:
Explanation
To give context:
Ruby 2.2+ on Windows doesn't compile the extensions Nokogiri requires.
The extensions of a gem are the extra dependencies (libraries) it uses.
They are built when you install the gem:
Extensions
Lack of extensions is preventing Nokogiri from running.
Extensions exist in the ext
folder of a gem (you can read about them here):
Mysql2
,RMagick
,PGSQL
, Nokogiri
etc all use extensions/libraries.
This is why - on Windows - you have to use custom switches (--with-opt-dir
) when installing the gem. This gives Ruby / the shell / (cmd
) the required lib
/ include
directories required to build the gem's files (it's the equivalent of how PATH
works).
On Linux
/Mac
, these directories are managed with the respective package managers (brew
/apt-get
). Windows does not have this, so you have to install the extensions manually.
Because Windows does not have a standard set of libraries, you have to download them yourself. You also have to build them yourself (which is tricky).
The fix for Nokogiri install is to use the right libraries and build tools to get the gem installed.
Build
The difference with Ruby 2.2+ is the gem will "install" without showing any exceptions. You think it has installed, only to find Rails does not load (hence the nokogiri/nokogiri.so
error).
This means you have to make sure you have the files on your system, and run the compiler to install them.
The above documentation should show you how to do that.
gem install nokogiri
? This will at least tell you why it wasn't installed as a dependency of Rails. – Godredbundle install
on rails directory – Creamery