web-dev-qa-db-ja.com

Cygwinでgemが機能しない

新しくインストールしたWindows7 Professional 64ビットに、Cygwin(64)とRubyを含むそのパッケージの一部をインストールしました。また、デフォルトのWindowsシェルとCygwinの両方で必要になる可能性があるため、Rubyインストーラーを使用してRubyをインストールしました。

gem listgem install fooのようなgemコマンドを実行しようとすると、インターネットを検索してから数時間以内に解決できなかった奇妙なエラーが発生します。

$ 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

ただし、Windows CMDのネイティブWindowsバージョンでは、問題なく動作します。ただし、CygwinのネイティブWindows Rubyのものはエラーが発生するため、使用できませんが、とにかくここでの質問ではありません。

Process Monitorを使用して、RubyはC:\cygwin64\bin\kernel32.dllを開こうとしましたが、そのファイルがないため失敗しました。kernel32.dllからC:\Windows\System32をコピーしてみました。 C:\Windows\SysWOW64からそのCygwinbinフォルダーにあるものでも、同じエラーが発生します(それ以外は、kernel32.dllをロードできません)。プロセスモニターにNAME NOT FOUNDエラーが表示されなくなりました。

ここでどんな魔法が起こっているのですか?ここで何が悪いのか本当に理解したいです。私はどんな助けにも感謝します。

6
Neonit

Cygwin2.5.2リリースの予期しない結果のようです

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

回避策として、cygwinパッケージを2.5.1にダウングレードします

3
matzeri

Rvmビルドプロセスを変更せずにこれを修正する方法は次のとおりです。

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

これは、Rubyが単にkernel32という名前の共有ライブラリを探しているためです。Cygwin2.5.1以前では、共有ライブラリのロードに「.dll」拡張子が自動的に追加されていました。ただし、cygwin2.5。 2は、完全な共有ライブラリファイル名を必要とするパッチを導入しました。ライブラリ検索パス(/usr/lib)内にシンボリックリンクを追加すると、古いスタイルの名前でロードされた場合でもライブラリを見つけることができます。

6
tombrown52

Ruby rvmを使用してインストールしたので、更新されたCygwin Rubyバイナリはあまり役に立たず、Cygwinインストールをダウングレードしたくありませんでした-どうすればよいですか?いつ再アップグレードしても安全だったか知っていますか?

Michael Dの回答の情報に従うと、問題はresolv.rb(私の場合は~\.rvm\rubies\Ruby-<version>\lib\Ruby\<version>\win32)にある~\.rvm\rubies\Ruby-2.1.7\lib\Ruby\2.1.0\win32ファイルにあるようです。

このファイルの先頭近くにコードがあります

module Kernel32
  extend Importer
  dlload "kernel32"
end

dlload "kernel32"行をdlload "kernel32.dll"に変更するだけで、修正されたようです。または、フルパスを使用します

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

も機能しましたが、重要なのは拡張機能のようです(拡張機能のないフルパスも機能しません)。

これは、より新しいバージョンのrvmで修正されている可能性がありますが、更新と再インストールの手間をかけたくなかったので、これで問題ありません。またはもちろん、これはインストールされているすべてのルビーに対して変更する必要があるでしょう。

4
zelanix

Rubyパッケージにネイティブライブラリ(少なくともkernel32.dll)の読み込みに問題があります。問題はdns.getresource("_rubygems._tcp.#{Host}", Resolv::DNS::Resource::IN::SRV)の呼び出しに起因し、おそらくkernel32.dllのネイティブ呼び出しを行うため、 kernel32.dllライブラリ。

ライブラリへのフルパスを指定すると、正しく機能します。

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

この問題を解決するには、次のことを試してください。

  1. extconf.rbを次のように実行する場合はdevkitを要求します:Ruby -rdevkit extconf.rb、またはrequire "devkit"extconf.rbに追加してから、スクリプトを通常どおり実行します。
  2. コンパイルする前に、devkitからdevkitvars.batスクリプトを実行して、ツールチェーンでPATHを構成します。
2
Michael D