A instalação do Nokogiri falha - o libxml2 está ausente

156

Eu sempre resolvi os problemas de instalação do Nokogiri seguindo a documentação no tutorial " Instalando o Nokogiri ".

Mas desta vez, mesmo depois de instalar todas as dependências, o Nokogiri não foi instalado. Estou tendo o erro a seguir:

libxml2 is missing.  please visit <http://nokogiri.org/tutorials/installing_nokogiri.html>

Tentei instalá-lo especificando os diretórios libxml2 e libxslt:

sudo gem install nokogiri -- --with-xml2-include=/usr/include/libxml2 --with-xml2-lib=/usr/lib --with-xslt-dir=/usr/

mas retornou o mesmo erro.

Eu segui todos os outros artigos relacionados ao Stack Overflow e nenhum ajudou. Alguém tem uma solução?

Rohit A.
fonte
1
Qual é o seu sistema operacional?
Jake Jones
2
Este é o mais apto Resposta-sudo apt-get install libxslt-dev libxml2-dev
Pratik Bothra

Respostas:

163

Primeiro, instale as dependências:

sudo apt-get install libxslt-dev libxml2-dev

Se você ainda receber o erro, poderá estar faltando uma cadeia de ferramentas do compilador:

sudo apt-get install build-essential

Você receberá o erro "libxml2 está ausente" se estiver faltando uma cadeia de ferramentas de compilação (pelo menos eu deparei com essa questão no Debian Lenny).

A construção Nokogiri compila teste-compila um arquivo de cabeçalho libxml2 para verificar se ele está presente, no entanto, não diferencia entre "libxml2 está ausente" e "um compilador para testar a libxml2 está ausente".

Erik Peterson
fonte
44
Se isso não é o problema, você pode precisar instalar libxml2-dev
Erik Peterson
1
Eu executei o comando acima e recebi o erro 'libxml2 is missing'. você pode me dizer mais sobre a instalação da cadeia de ferramentas de construção. b'cos eu não encontrei muita ajuda nele.
Rohit A.
1
Recebi essa mensagem porque não tinha o gcc (ou qualquer outro compilador) instalado. Eu não tinha uma cadeia de ferramentas do compilador.
Erik Peterson
7
Se você estiver em um Mac: Brew instalar libxslt em seguida, preparar instalar libxml2
Sam Backus
245

Você pode realmente precisar instalar esses dois pacotes

sudo apt-get install libxslt-dev libxml2-dev
Ryan
fonte
7
Como um comentário classificado como altamente está abaixo da resposta aceita?
Nova Alexandria
3
Porque a pergunta dizia "mesmo depois de instalar todas as dependências". Portanto, a resposta aceita é a correta.
b0fh
62

No Mac OS X (Mavericks), a instalação das bibliotecas brewe a configuração NOKOGIRI_USE_SYSTEM_LIBRARIES=1antes de instalar a gem fizeram o truque para mim.

Resumindo:

  • Se instalado anteriormente, desinstale a gema:

    gem uninstall nokogiri
  • Use Homebrew para instalar libxml2, libxslte libiconv:

    brew install libxml2 libxslt libiconv
  • Instale a gema especificando os caminhos para as bibliotecas a serem vinculadas:

    NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"
Eduardo
fonte
Eu recebi alguns erros sobre o libiconv: "A Apple distribui o libiconv com o OS X, você pode encontrá-lo em / usr / lib." Mas simplesmente copiar o script de instalação da gem funcionou :) Obrigado!
Automatico
Obrigado! depois de uma manhã inteira tentando instalar o nokogiri, sua resposta (especificamente com os caminhos de configuração) finalmente funcionou - em vez da instalação informando (sem ajuda) que libxml2 não existia, mesmo quando os caminhos estavam corretos.
Pebbl
2
Usando a porta em vez de cerveja no OS X e indo só $ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogirifez o truque
Andres Kütt
2
Em OSX El Capitan 10.11.2, eu tenho que usar brew install libxml2 libxslt homebrew/dupes/libiconvpara que ele funcione
Hai Feng Kao
2
Além disso, preciso adicionar --with-xml2-include="/usr/local/opt/libxml2/include/libxml2"para o gem install nokogiricomando funcionar. Otherwse, ele irá mostrar libxml2 version 2.6.21 or later is required!(a minha versão libxml2 é 2.9.2)
Hai Feng Kao
22

Eu apenas tive o mesmo problema no Fedora 13. Após uma pesquisa frustrante e malsucedida para fazer

gem install nokogiri

trabalhar para mim, eu era capaz de instalá-lo e contornar o erro libxml2 via yum.

Simplesmente instale a gem via em yumvez do gemcomando:

su
yum search rubygem-nokogiri   #this find the proper package name
yum install rubygem-nokogiri.i686

Isso me ajudou a encontrar a resposta certa para o Fedora e, como estou usando o RVM para gerenciamento de pacotes Ruby,

yum install rubygem-nokogiri

atrai todas as gemas e dependências do Ruby para o sistema, não para o meu ambiente RVM e, em minha experiência, isso leva a uma experiência muito frustrante e humilhante.

Então, analisando a gema Nokogiri yum, você pode usar:

yum provides  rubygem-nokogiri

e obtenha uma lista das dependências para rubygem-Nokogiri que me mostraram as bibliotecas que estavam faltando. Depois disso eu corri:

yum install libxml2-devel libxslt libxslt-devel

Agora, o Nokogiri compila nas instalações do Fedora e do Nokogiri. D'oh !, precisamos dos cabeçalhos para compilar Nokogiri das bibliotecas devel.

Sojoodi
fonte
Isso fez isso por mim, embora em ubuntu eu tive que usar o apt-get install libnokogiri-ruby1.9.1 , em seguida, editar o Gemfile para pedir nokogiri 1.5.5 em vez de 1.5.9
ffflabs
13

No Mac OS X (Mavericks), se nenhuma dessas soluções funcionar, tente:

ARCHFLAGS="-arch x86_64" gem install nokogiri

ou

ARCHFLAGS="-arch i386" gem install nokogiri

dependendo da arquitetura do seu sistema.

rilla
fonte
13

Você geralmente precisa de arquivos de desenvolvimento para construir gemas. Experimentar:

sudo apt-get install libxslt-dev libxml2-dev

(Acabei de ver que Eric sugeriu o mesmo em um comentário.)

pduersteler
fonte
11

Consegui instalar isso com o Chocolatey , Windows 8.1 x64 e DevKit x64.

cinst libxml2
cinst libxslt
cinst libiconv

gem install nokogiri -- 
  --with-xml2-include=C:\Chocolatey\lib\libxml2.2.7.8.7\build\native\include 
  --with-xml2-lib=C:\Chocolatey\lib\libxml2.redist.2.7.8.7\build\native\bin\v110\x64\Release\dynamic\cdecl 
  --with-iconv-include=C:\Chocolatey\lib\libiconv.1.14.0.11\build\native\include 
  --with-iconv-lib=C:\Chocolatey\lib\libiconv.redist.1.14.0.11\build\native\bin\v110\x64\Release\dynamic\cdecl 
  --with-xslt-include=C:\Chocolatey\lib\libxslt.1.1.28.0\build\native\include 
  --with-xslt-lib=C:\Chocolatey\lib\libxslt.redist.1.1.28.0\build\native\bin\v110\x64\Release\dynamic

Você precisará verificar se o número da versão nos caminhos está correto.

Pode ser necessário adicionar o repositório NuGet da Microsoft:

-Source "https://go.microsoft.com/fwlink/?LinkID=230477"
Chloe
fonte
Eu recebo 'Não foi possível encontrar o pacote libxml2'. Que fontes você tem no Chocolately?
Isaac Waller
3
Encontrou o problema! O Nuget sources foi desativado no arquivo de fontes do Chocolatey! Mas o gem não funciona: [tid-1789500] 126: Não foi possível encontrar o módulo especificado. Você pode usar o seguinte código: #Ruby200/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.1/lib/nokogiri/nokogiri.so (LoadError)
Ratko Stibric
@RatkoStibric Eu acho que você tem que construir com as bibliotecas dinâmicas: ...\x64\Release\dynamic\cdecl.
Chloe
1
Quando o chocolately estiver instalado, adicione uma fonte usando o seguinte comando:chocolatey sources add -name NuGet -source "https://go.microsoft.com/fwlink/?LinkID=230477"
Richard Peck
1
Obrigado por Chocolatey, nunca soube disso antes!
Richard Peck #
11

Será:

sudo yum install -y libxml2 libxml2-devel

nos servidores RHEL.

Hohner
fonte
6

No macOS, nenhuma das opções acima / abaixo realmente funcionou para mim até eu fornecer explicitamente o caminho libxml2 do XCode --with-xml2-include.

gem install nokogiri -- --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/libxml2 --use-system-libraries
sobstel
fonte
4

Consegui instalar o Nokogiri 1.6.5 no Fedora 20 fazendo o seguinte:

export NOKOGIRI_USE_SYSTEM_LIBRARIES=true

Em seguida, executando:

gem install nokogiri
Simone
fonte
4

Para qualquer outra pessoa com esse problema, resolvi-o executando este comando no diretório do projeto

gem install nokogiri -- --use-system-libraries

Atualização: Eu me deparei com isso novamente e tentei apenas atualizar a gema que funcionava para mim ...

gem update nokogiri

Jbur43
fonte
2

Você já tentou instalar o libxml2? Não de rubygems, mas através do processo de instalação padrão do seu sistema operacional. No Ubuntu / Debian, por exemplo:

sudo apt-get install libxml2

Em qualquer versão recente do OS X, ele já deve estar instalado.

d11wtq
fonte
Estou no ubuntu e segui todas as instalações acima, conforme informado nas outras perguntas sobre o stackoverflow.
Rohit A.
1

Para usuários do OSX, se você já teve sucesso na instalação do Nokogiri, ainda está tendo erros ao instalá-lo, digamos, usando uma nova versão do Ruby que você adicionou e esse erro que inclui uma mensagem como:

The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.

Isso pode ser indicativo de que uma atualização do XCode ocorreu através da App Store, manual ou automaticamente, e você não a abriu desde então.

Nesse caso, você deve poder abrir o XCode, concordar com a nova licença e instalar o Nokogiri com sucesso.

Paul Fioravanti
fonte
1

No Mac OS X Yosemite, meu erro foi tentar usar sudo gem installquando é uma regra geral não usar privilégios de superusuário ao instalar gemas.

No meu caso, ele tentou modificar a instalação do sistema do Ruby, e isso não é uma boa ideia. Instalei o rbenv, instalei o Ruby 2.2.2 através dele e o configurei como global, que é um termo da documentação do rbenv. Depois disso, o Nokogiri poderia se instalar com um simples

gem install nokogiri

Não foram necessários hacks ou soluções alternativas, apenas um ambiente definido adequadamente; Nokogiri faz o resto perfeitamente.

Aleks N.
fonte
Usar sudoestá OK SE você entender como funciona, onde terá efeito, por que os arquivos que estão sendo instalados ou atualizados devem ser instalados e como desfazer a ação, se falhar. Caso contrário, usando uma caixa de areia como rbenv ou RVM é um REALMENTE boa idéia.
the Tin Man
1

Conseguiu instalar o vagrant-incrédulo seguindo a postagem acima, mas usando o comando da seguinte maneira:

NOKOGIRI_USE_SYSTEM_LIBRARIES=1 vagrant plugin install vagrant-aws
Romi
fonte
0

Consegui instalar o Nokogiri executando os seguintes pacotes:

$ dnf group install "C Development Tools and Libraries"
$ dnf install ruby-devel libxml2-devel patch
user1455180
fonte
0

=== TLDR ===

Conforme as instruções , construa o Ruby com o compilador clang mais recente, ou pelo menos a mesma versão que o Rubygems usará para compilar as extensões nativas do Nokogiri libxml e libxsl.

Se estiver usando o RVM, construir a partir da origem com a --with-ggc=clangbandeira foi o que fez por mim:

rvm install 2.2 --with-gcc=clang

Substitua 2.2pela versão que desejar. --with-gcc=clanggarante que o RVM seja compilado a partir da fonte e use clang para fazer isso; caso contrário, o RVM pode ser um Ruby binário pré-construído, que foi o que me levou à loucura.

Em seguida, instale o Nokogiri normalmente usando Bundler ou Rubygems.

=== EM PROFUNDIDADE ===

Eu lutei com isso por um tempo. gem install nokogirideu-me:

checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no

Cavando mkmf.logvi:

conftest.c:15:27: error: too few arguments to function call, single argument 'cur' was not specified
int t(void) { xmlParseDoc(); return 0; }  

O Nokogiri fornece seu próprio libxml e libxsl (a partir de 1.6.4). A assinatura definida na cópia local de Nokogiri do parser.h (encontrada no diretório gem install) é:

xmlParseDoc (const xmlChar *cur);                                                                                                                                                                                

Portanto, não sabia como a chamada do método no uso do arquivo conftest.c hermeticamente selado não poderia corresponder ao arquivo de cabeçalho para parser.h.

Quando percebi que provavelmente tinha instalado um Ruby binário, removi e reinstalei usando --with-gcc=clang(para forçar a compilação e usar o clang) e o problema foi resolvido:

rvm uninstall 2.2
rvm install 2.2 --with-gcc=clang
gem install nokogiri

Não sei exatamente por que isso funciona, pois o cabeçalho libxml do sistema /usr/include/libxml2/libxml/parser.htem a mesma assinatura que a cópia local de Nokogiri.

É estranho, mas funcionou. Apenas certifique-se de compilar um Ruby com clang.

Johnster
fonte
0
gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.7.8/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.7.8/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26 --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib

Mude sua versão com ela.

Liber
fonte