Błąd: Nie udało się zbudować natywnego rozszerzenia gem podczas próby pobrania Rubocop

13

kiedy próbuję „sudo gem install rubocop”, otrzymuję ...

Building native extensions.  This could take a while...
ERROR:  Error installing rubocop:
    ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.3.0/gems/rainbow-2.2.1/ext
/usr/bin/ruby2.3 mkrf_conf.rb

current directory: /var/lib/gems/2.3.0/gems/rainbow-2.2.1/ext
/usr/bin/ruby2.3 -rubygems /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/rake RUBYARCHDIR=/var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/rainbow-2.2.1 RUBYLIBDIR=/var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/rainbow-2.2.1
/usr/bin/ruby2.3: No such file or directory -- /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/rake (LoadError)

rake failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.3.0/gems/rainbow-2.2.1 for inspection.
Results logged to /var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/rainbow-2.2.1/gem_make.out

Wypróbowałem więc szereg rozwiązań, w szczególności te z /programming/22544754/failed-to-build-gem-native-extension-installing-compass (inny klejnot, ten sam błąd)

Próbowałem ponownie zainstalować RVM z opcją „rvminstall -disable-binary 2.2.0”, co zajęło trochę czasu, ale go nie naprawiłem

następnie spróbowałem $ "sudo apt-get install ruby-dev", co daje

Reading package lists... Done
Building dependency tree       
Reading state information... Done
ruby-dev is already the newest version (1:2.3.0+1).
The following packages were automatically installed and are no longer required:
  dkms linux-headers-4.4.0-53 linux-headers-4.4.0-53-generic
  linux-image-4.4.0-53-generic linux-image-extra-4.4.0-53-generic
  python-appindicator python-gconf python-gi python-glade2
  python-gobject python-pexpect python-ptyprocess python-xdg
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 40 not upgraded.

Próbowałem też „aktualizacji systemu klejnotów - system”, do którego dostaję ...

Latest version currently installed. Aborting.

Wszelkie sugestie będą mile widziane, ponieważ jestem całkowitym noobem i utknąłem.

użytkownik642832
źródło
Jak mówi błąd, czy masz rakezainstalowany?
muru
Tak. Mam najnowszą wersję.
user642832,

Odpowiedzi:

27

Zrób, sudo gem install rakea następnie zrób to jeszcze sudo gem install rubocopraz i powinno działać.

Wydaje się nie mieć znaczenia, że ​​masz zainstalowaną odpowiednią wersję rake. Dla mnie rake --versionzgłoszono, 10.5.0ale wciąż otrzymywałem ten sam komunikat o błędzie co ty.

Patrząc na komunikat o błędzie, szuka rakekonkretnej ścieżki, nie tylko nigdzie na moim PATH:

/usr/bin/ruby2.3: No such file or directory -- /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/rake (LoadError)

which rakeraporty /usr/local/bin/rake, nie /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/rake.

W rzeczywistości, jak mówi komunikat o błędzie, nie ma pliku w /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/rake.

Prawdopodobnie ma to związek z rakebyciem apt-get installed zamiast gem installed. sudo gem install raketworzy ten plik.

Sean Hammond
źródło
3

Byłem w stanie rozwiązać ten problem

sudo mkdir -p /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin
sudo ln -s /usr/bin/rake /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/

Zobacz to zatwierdzenie na GitHub .

Shaun Jackman
źródło
2

Kiedy odpowiedziałem na to w 2017 roku, byłem sceptycznie nastawiony do rozwiązania @ SeanHammond, ponieważ klejnot rake już się pojawił. Okazało się, że było to możliwe dzięki pakietowi rake Debiana i ich systemowi integracji rubygemów. Ponowne zainstalowanie klejnotu rake, według pana Hammonda, zadziałało dla mnie dzisiaj, ponieważ przesłoniło wersję Debiana, dlatego uniknęło podstawowego błędu. Cóż, najpierw powiedział:

martind@balance:~$ sudo gem2.1 install --no-ri --no-rdoc rake
Fetching: rake-12.3.1.gem (100%)
ERROR:  While executing gem ... (TypeError)
    no implicit conversion of nil into String
martind@balance:~$ 

Po zastosowaniu poprawki wstępnej do zgłaszania błędów, która mówi:

rake's executable "rake" conflicts with an unknown executable
Overwrite the executable? [yN]  n
ERROR:  Error installing rake:
    "rake" from rake conflicts with installed executable from 
martind@balance:~$ 

... co doprowadziło mnie do sukcesu:

martind@balance:~$ sudo gem2.1 install --no-ri --no-rdoc --format-executable rake
Successfully installed rake-12.3.1
1 gem installed
martind@balance:~$ 

To wystarczy, aby rubygemy znalazły zaktualizowany plik binarny:

martind@balance:~$ ruby2.1 -we 'puts(Gem.bin_path("rake", "rake"))'
/var/lib/gems/2.1.0/gems/rake-12.3.1/exe/rake
martind@balance:~$ ls -l /var/lib/gems/2.1.0/gems/rake-12.3.1/exe/rake
-rwxr-xr-x 1 root root 1182 Apr 17 15:03 /var/lib/gems/2.1.0/gems/rake-12.3.1/exe/rake
martind@balance:~$ 

@ Rozwiązanie ShaunJackman również dla mnie zadziałało. To może być sposób, w jaki Debian powinien to naprawić, chociaż wolałbym nie pozostawiać plików w katalogu na moim komputerze, które Debian może później chcieć zmienić.

Mniej bolesnym obejściem było ustawienie rake=/usr/bin/rakew środowisku, z którego zainstalowałem klejnot, który chciałem:

martind@balance:~$ rake=/usr/bin/rake sudo gem2.1 install --no-ri --no-rdoc mediawiki_api
Fetching: unf-0.2.0.beta2.gem (100%)
Building native extensions.  This could take a while...
Successfully installed unf-0.2.0.beta2
Fetching: mediawiki_api-0.7.1.gem (100%)
Successfully installed mediawiki_api-0.7.1
2 gems installed
martind@balance:~$ 

... jak teraz zauważono w moim raporcie o błędach Debiana . Twoje sudo może potrzebować --preserve-env, aby przejść przez to ustawienie.

(We wcześniejszej wersji tej odpowiedzi twierdziłem, że „ekwiwalent sudo gem install rainbowrozwiązanego problemu”, ale okazuje się, że mój problem nie był równoważny. Mój problem nie dotyczył klejnotu, tęczy i rubocopa, ale właściwie gem2.1, mediawiki- gateway (lub jego następca, mediawiki_api) i unf. Powodem, dla którego najpierw ręcznie działała moja zależność, było to, że gem2.1 ma błąd, w wyniku którego woli instalować wersje wstępne jako zależności. Podejrzewam, że na podstawie kodu zamiast proza, że ​​to ten błąd, Gdy zostanie poproszony o samodzielne zainstalowanie unf, zamiast tego słusznie wybiera wersję wydania, taką, która akurat używa ścieżki ExtConfBuilder rubygem, a nie RakeBuilder. To nie pomogłoby oryginalnemu plakatowi z ich problemem tęczy, ponieważ nie dostali wersji wstępnej. Przepraszam za długą dygresję, ale być może pomoże to komuś, kto boryka się z podobnym problemem).

Martin Dorey
źródło
1
jeszcze prostsze dla mnie: rake=rakepracował
Anthony Sottile