自制软件安装Ruby Keg-only找不到gem

ma1*_*w28 4 ruby homebrew rubygems

irb使用Homebrew安装Ruby后如何工作?

当我尝试运行时irb,出现错误:

$ irb
Traceback (most recent call last):
    2: from /usr/local/opt/ruby/bin/irb:23:in `<main>'
    1: from /usr/local/lib/ruby/site_ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
/usr/local/lib/ruby/site_ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': can't find gem irb (>= 0.a) with executable irb (Gem::GemNotFoundException)
Run Code Online (Sandbox Code Playgroud)

我试过了:

$ brew link ruby
Warning: Refusing to link macOS-provided software: ruby
If you need to have ruby first in your PATH run:
  echo 'export PATH="/usr/local/opt/ruby/bin:$PATH"' >> ~/.bash_profile

For compilers to find ruby you may need to set:
  export LDFLAGS="-L/usr/local/opt/ruby/lib"
  export CPPFLAGS="-I/usr/local/opt/ruby/include"
Run Code Online (Sandbox Code Playgroud)

我的/etc/paths文件顶部下面有几行:

/usr/local/bin
/usr/local/opt/ruby/bin
/usr/local/lib/ruby/gems/2.6.0/bin
Run Code Online (Sandbox Code Playgroud)

irb不会显示在的输出中gem list,但:

$ find /usr/local -name irb
/usr/local/lib/ruby/2.6.0/irb
/usr/local/Cellar/ruby/2.6.0_1/bin/irb
/usr/local/Cellar/ruby/2.6.0_1/lib/ruby/2.6.0/irb
/usr/local/Cellar/ruby/2.6.0_1/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb
/usr/local/Cellar/ruby/2.6.0_1/share/ri/2.6.0/system/lib/irb
Run Code Online (Sandbox Code Playgroud)

我也有ri&的类似问题rdoc

Eri*_*Guo 5

奔跑:gem install irb现在您可以出发了。


edd*_*oid 4

假设您正在使用 Homebrew Ruby...

可执行文件irb位于:

/usr/local/opt/ruby/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb
Run Code Online (Sandbox Code Playgroud)

您可以直接使用该行,将其符号链接到您的$PATHaliasit 或其他内容中。


或者,您可以/usr/local/opt/ruby/bin/irb在第 22 行附近进行修补。

# patch
class Gem::BasicSpecification
  def self.default_specifications_dir
    File.join(Gem.private_dir, "specifications", "default")
  end
end
# /patch

# Next line looks like this. Don't change this.
# if Gem.respond_to?(:activate_bin_path)
Run Code Online (Sandbox Code Playgroud)

您也可以在/usr/local/opt/ruby/bin/ri和中执行相同的操作来修补这些命令。/usr/local/opt/ruby/bin/rdoc

为什么?

请参阅https://github.com/Homebrew/homebrew-core/blob/955497722b9bf65069957b0e7c903b96939cdd99/Formula/ruby.rb#L112

Homebrew Ruby 公式假设所有 gem 都将安装在“全局 gem 目录”中/usr/local/lib/ruby/gems/2.6.0/。因此,当您卸载并重新安装 Homebrew Ruby 时,gems 会保留下来 - 您也不必重新安装它们(有点烦人,因为我已经为 Ruby 版本安装了 gem,我什至不再安装了,但这是另一个问题)。

但 Ruby 的默认 gem 并不位于全局 gem 目录中。它们位于 Ruby 安装目录中(Homebrew 公式称为private_dir):/usr/local/opt/ruby/lib/ruby/gems/2.6.0/

所以 Homebrew Ruby 找不到它们。

Homebrew 修补了 Rubygems,因此此代码片段再次修补了 Rubygems ,但更深。您还可以像这样进行修补:

module Gem
  def self.default_dir
    private_dir  
  end
end
Run Code Online (Sandbox Code Playgroud)

default_dir 在其他地方使用,我不想破坏任何东西。