Ruby/Linux 已安装的 gem 未加载

Ruby/Linux Installed gems not loaded

我正在设置新的 Ubuntu 18.04 VM,我的 Ruby 应用程序出现问题。 Ruby 是版本 2.5.1(18.04 的标准)。 Gem 使用 sudo 安装,因为它们由应用 运行 在几个不同的 uid 下加载。

他们没有找到任何已安装的 gem!

rful011@secgenprd02:~$ sudo gem install sys-proctable
Fetching: sys-proctable-1.2.5.gem (100%)
Successfully installed sys-proctable-1.2.5
Parsing documentation for sys-proctable-1.2.5
Installing ri documentation for sys-proctable-1.2.5
Done installing documentation for sys-proctable after 0 seconds
1 gem installed

rful011@secgenprd02:~$ irb
irb(main):001:0> require "sys/proctable"
Traceback (most recent call last):
    4: from /usr/bin/irb:11:in `<main>'
    3: from (irb):1
    2: from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
    1: from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
LoadError (cannot load such file -- sys/proctable)

gem 环境说:

  - GEM PATHS:
    - /var/lib/gems/2.5.0

ls:

rful011@secgenprd02:~$ ls -ld /var/lib/gems/2.5.0/gems/sys-proctable-1.2.5/
drwxr-xr-x 6 root root 181 Jul  7 17:26 /var/lib/gems/2.5.0/gems/sys-proctable-1.2.5/

欢迎就如何诊断此问题提出任何建议!我正在考虑擦除 VM 并重新开始——不幸的是,这不是微不足道的。

一个额外的数据点。 gems 最初是由 puppet 安装的,它使用拒绝 'other' 访问的 umask 运行(puppet 包 gem 提供程序的已知功能)。我手动卸载了它们,然后使用正确的 umask 从进程中重新安装了它们。我已经仔细检查了安装的gems.

中所有文件的权限

我最好的猜测是还有其他东西有错误的权限,导致 gem 无法加载。

$ gem install sys-proctable                                                                                                                                                                                             ‹2.6.1›
Fetching sys-proctable-1.2.5.gem
Successfully installed sys-proctable-1.2.5
Parsing documentation for sys-proctable-1.2.5
Installing ri documentation for sys-proctable-1.2.5
Done installing documentation for sys-proctable after 0 seconds
1 gem installed

~/code/test/ts ⌚ 3:19:05
$ irb                                                                                                                                                                                                                   ‹2.6.1›
irb(main):001:0> require 'sys/proctable'
=> true

适合我。您使用 sudo gem install 而不是 gem install 有什么特别的原因吗?另外,您是如何安装 Ruby 的?我的猜测是 sudo 全局安装与您的安装方式冲突 Ruby?我使用 rbenv,它在 Ubuntu.

上运行良好

我终于找到了,这是一个文件权限问题,因为初始安装时使用了不正确的 umask。

rful011@secgenprd02:~$ ls -ld /var/lib/gems/2.5.0/*
drwx------  2 root root    6 Jun 26 11:18 /var/lib/gems/2.5.0/build_info
drwx------  2 root root 4096 Jul  7 17:26 /var/lib/gems/2.5.0/cache
drwx------  3 root root   33 Jul  5 10:04 /var/lib/gems/2.5.0/doc
drwx------  3 root root   26 Jun 26 11:18 /var/lib/gems/2.5.0/extensions
drwxr-xr-x 29 root root 4096 Jul 13 08:28 /var/lib/gems/2.5.0/gems
drwx------  2 root root 4096 Jul 13 08:28 /var/lib/gems/2.5.0/specifications

我已经修复了 gems 目录,但没有修复其他目录。特别是在加载 gems 时会访问特定规范,仅修复此问题即可加载 gems。

非常令人困惑的是 ruby 捕获了文件权限失败,您得到的只是 erroneous/confusing“无法加载此类文件 --