permata tidak bekerja di Cygwin

4

Pada Windows 7 Professional 64 Bit yang baru diinstal saya menginstal Cygwin (64) dan beberapa paketnya, termasuk Ruby. Saya juga telah menginstal Ruby menggunakan installer Ruby, karena saya mungkin akan membutuhkannya untuk shell Windows default dan Cygwin.

Sekarang ketika saya mencoba menjalankan a gem perintah suka gem list atau gem install foo, Saya mendapatkan kesalahan aneh yang gagal saya selesaikan dalam beberapa jam terakhir pencarian di internet.

$ which ruby
/usr/bin/ruby

$ which gem
/usr/bin/gem

$ ruby -v
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-cygwin]

$ gem -v
2.4.8

$ gem list
ERROR:  Loading command: list (Fiddle::DLError)
        can't load kernel32
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

$ gem install sass
ERROR:  Loading command: install (Fiddle::DLError)
        can't load kernel32
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

Namun, dengan versi Windows asli, dari Windows CMD, ia berfungsi tanpa masalah. Namun saya tidak dapat menggunakan hal-hal asli Windows Ruby dari Cygwin, karena itu memberi saya kesalahan, tapi itu bukan pertanyaannya di sini.

Dengan Process Monitor saya tahu bahwa Ruby mencoba untuk membuka C:\cygwin64\bin\kernel32.dll dan gagal, karena file itu tidak ada. Saya mencoba menyalin kernel32.dll dari C:\Windows\System32 dan yang dari C:\Windows\SysWOW64 ke dalam Cygwin itu bin folder dan masih mendapat kesalahan yang sama (terlepas dari itu katanya tidak dapat memuat kernel32.dll ), meskipun Monitor Proses tidak menunjukkan a NAME NOT FOUND kesalahan lagi.

Sihir apa yang terjadi di sini? Saya benar-benar ingin memahami apa yang salah di sini. Saya menghargai bantuan apa pun.

Neon
sumber

Jawaban:

3

Tampaknya hasil yang tidak terduga dari rilis cygwin 2.5.2

https://www.cygwin.com/ml/cygwin/2016-06/msg00378.html

Sebagai solusi, turunkan paket cygwin ke 2.5.1

matzeri
sumber
"Masalah terpecahkan" Itu hanya memperbaiki masalah ketika Anda menginstal Ruby melalui installer Cygwin, kan? Saya mendapatkan kesalahan ini ketika mencoba menginstal melalui RVM, jadi saya kira satu-satunya pilihan saya adalah menurunkan Cygwin.
Ajedi32
Jika ruby ​​tidak diinstal dengan "Cygwin installer" daripada bukan program cygwin dan saya tidak melihat mengapa ia harus peduli tentang loader dll cygwin.
matzeri
RVM bekerja dengan mengunduh dan mengkompilasi Ruby dari sumber. Jadi jika Anda menjalankannya di lingkungan Cygwin, maka binari yang dihasilkan akan menjadi "program Cygwin". Bagaimanapun, menurunkan versi Cygwin ke 2.5.1 memang menyelesaikan masalah saya.
Ajedi32
@ Ajedi32, jika ini masih menjadi masalah bagi Anda, saya mengirim jawaban untuk rubi yang dipasang RVM di bawah ini. Saya tidak benar-benar ingin menurunkan versi Cygwin saya!
zelanix
6

Cara untuk memperbaikinya tanpa mengubah proses pembuatan rvm adalah:

ln -s /cygdrive/c/Windows/System32/kernel32.dll /usr/lib/kernel32

Ini terjadi karena ruby ​​mencari perpustakaan bersama yang diberi nama sederhana kernel32. Cygwin 2.5.1 dan sebelumnya secara otomatis menambahkan ekstensi ".dll" ke beban pustaka bersama. Tapi cygwin 2.5.2 memperkenalkan tambalan yang membutuhkan nama file pustaka bersama penuh. Menambahkan tautan simbolis dalam jalur pencarian perpustakaan ( /usr/lib ) memungkinkan perpustakaan ditemukan bahkan ketika dimuat dengan nama gaya lama.

tombrown52
sumber
1
+1 IMHO solusi ini adalah yang paling rapi karena tidak perlu mengedit resolv.rb. Bekerja dengan Cygwin 2.6.0 dan rbenv
edwardsmatt
4

Saya menginstal ruby ​​menggunakan rvm sehingga biner Cygwin ruby ​​yang diperbarui tidak banyak membantu dan saya tidak benar-benar ingin menurunkan versi instalasi Cygwin saya - bagaimana saya tahu kapan aman untuk memutakhirkan lagi?

Mengikuti informasi dalam jawaban Michael D, masalahnya tampaknya ada di resolv.rb file terletak di ~\.rvm\rubies\ruby-<version>\lib\ruby\<version>\win32 (dalam hal ini ~\.rvm\rubies\ruby-2.1.7\lib\ruby\2.1.0\win32 ).

Di suatu tempat dekat bagian atas file ini, ada kode

module Kernel32
  extend Importer
  dlload "kernel32"
end

Cukup mengubah dlload "kernel32" baris ke dlload "kernel32.dll" sepertinya memperbaikinya untuk saya. Atau menggunakan jalur lengkap

dlload "c:/Windows/System32/kernel32.dll"

juga berfungsi, tetapi tampaknya ekstensi yang merupakan bagian penting (jalur penuh tanpa ekstensi juga tidak berfungsi).

Ini mungkin telah diperbaiki dalam versi rvm yang lebih baru, tetapi saya tidak ingin melalui kerumitan memperbarui dan menginstal ulang, jadi ini bekerja untuk saya. Atau tentu saja ini mungkin perlu diubah untuk semua rubi yang terpasang.

zelanix
sumber
Masalahnya terpecahkan sejak 28 Juni . Saya tidak merekomendasikan menggunakan instalasi rvm dari Cygwin. Saya hanya punya masalah dengan itu, paling lambat ketika permata perlu dikompilasi. Dan saya tidak melihat masalah dengan versi Cygwin (selain dari yang ini, yang telah diperbaiki dan dapat diselesaikan dengan mudah).
Neon
1
@Neon, baik saya lebih suka menggunakan rvm sehingga saya dapat dengan mudah menguji versi ruby ​​yang berbeda dan menggunakan permata sehingga bagi saya masalahnya tidak terpecahkan, tetapi masing-masing untuk mereka sendiri.
zelanix
Juga, cygwin tidak menyediakan versi ruby ​​terbaru. Misalnya 2.3.1 tidak tersedia di repo. Juga, ada proyek-proyek itu menggunakan khusus rvm, untuk mengelola versi ruby ​​yang digunakan dengan benar.
Timotei
2

Paket Ruby memiliki masalah memuat pustaka asli (setidaknya kernel32.dll). Masalahnya berasal dari panggilan ke dns.getresource("_rubygems._tcp.#{host}", Resolv::DNS::Resource::IN::SRV) yang mungkin membuat panggilan asli ke kernel32.dll karenanya memuat kernel32.dll Perpustakaan.

Jika Anda menentukan path lengkap ke perpustakaan, itu akan berfungsi dengan benar.

kernel = Fiddle::Handle.new("c:/Windows/System32/kernel32.dll")

Untuk mengatasi masalah ini, cobalah hal berikut:

  1. Memerlukan devkit saat berlari extconf.rb sebagai berikut: ruby -rdevkit extconf.rb , atau hanya menambahkan require "devkit" untuk extconf.rb lalu jalankan skrip secara normal.
  2. Jalankan devkitvars.bat skrip dari devkit untuk mengkonfigurasi PATH dengan toolchain sebelum dikompilasi.
Michael D
sumber
1
Saya tidak mengerti apa yang Anda ingin saya lakukan. Saya hanya menggunakan gem, tidak ada skrip dari sisiku. Jadi saya tidak dapat menentukan path lengkap dan saya tidak tahu apa itu extconf.rb bukan bagaimana atau kapan menggunakannya. Saya juga tidak mengkompilasi apa pun. Tolong berikan beberapa instruksi lebih lanjut sehingga saya dapat menguji apa yang Anda sarankan.
Neon
Untuk mengetahui lebih banyak tentang extconf.rb silakan lihat sini . Untuk memeriksa pemuatan kernel32.dll coba gunakan ini naskah.
Michael D
Maaf, sepertinya saya sudah memasang tautan yang sama dua kali, ini dia naskah yang saya bicarakan dalam komentar sebelumnya.
Michael D