'require':无法加载此类文件'gem'(LoadError)

问题描述 投票:0回答:1

我意识到有很多问题与此相同,但我没有成功解决我的问题。我正在尝试使用gem'vpn',为了学习目的,我想我会开辟一个全新的项目。按照以下安装说明:https://github.com/ronen/vpn(gem也在rubygems.org上)并在我的代码中需要gem,我得到require': cannot load such file -- vpn (LoadError)

我已经验证了我的版本。 gem env给出

RubyGems Environment:
  - RUBYGEMS VERSION: 2.7.7
  - RUBY VERSION: 2.5.1 (2018-03-29 patchlevel 57) [x86_64-darwin17]
  - INSTALLATION DIRECTORY: /Users/user/.rvm/gems/ruby-2.5.1
  - USER INSTALLATION DIRECTORY: /Users/user/.gem/ruby/2.5.0
  - RUBY EXECUTABLE: /Users/user/.rvm/rubies/ruby-2.5.1/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/user/.rvm/gems/ruby-2.5.1/bin
  - SPEC CACHE DIRECTORY: /Users/user/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Users/user/.rvm/rubies/ruby-2.5.1/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-17
  - GEM PATHS:
     - /Users/user/.rvm/gems/ruby-2.5.1
     - /Users/user/.rvm/gems/ruby-2.5.1@global
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /Users/user/.rvm/gems/ruby-2.5.1/bin
     - /Users/user/.rvm/gems/ruby-2.5.1@global/bin
     - /Users/user/.rvm/rubies/ruby-2.5.1/bin
     - /Users/user/.rvm/bin
     - /Library/Frameworks/Python.framework/Versions/3.7/bin
     - /Library/Frameworks/Python.framework/Versions/3.7/bin
     - /usr/local/bin
     - /usr/bin
     - /bin
     - /usr/sbin
     - /sbin
     - /Applications/Wireshark.app/Contents/MacOS

ruby --versionruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

在我的宝石文件中,我有gem: 'vpn'

gem list确实返回vpn (0.2.1)

任何帮助将不胜感激。提前致谢。

我尝试过的:

P.S我没有rake文件。我没有设置一个因为我不太确定它会解决我的问题而且我在找到如何创建问题时遇到了问题。

ruby-on-rails ruby rubygems
1个回答
0
投票

这里的问题似乎与vpn宝石的结构方式有关。现代宝石有一种模式:

  • 可执行文件放在gem中的bin / exe目录中
  • Ruby代码放在gem中<gem-name>.rb目录下的libfile中

因此,当用户调用require <gem-name>时,Ruby会尝试加载<gem-name>-<gem-version>/lib/<gem-name>.rb并返回LoadError(如果没有)。 例如,当用户在gem 'jekyll', '3.8.0'中列出Gemfile时,Ruby将首先尝试加载jekyll-3.8.0/lib/jekyll.rb

对于Ruby加载另一个目录而不是~/lib/<gem-name>.gemspec应该通过require_paths=设置指定。 例如,要加载david.rb上安装的david-rb文件(来自0.1.0版本的~/gems/david-rb-0.1.0/code/david.rb的假设宝石),david-rb.gemspec应该具有以下内容:

Gem::Specification.new do |s|
  # preceding lines ...

  s.require_paths = ["lib", "code"]

  # following lines ...
end

现在当david-rb gem的消费者调用require 'david'时,Ruby将首先尝试从david.rb然后从~/gems/david-rb-0.1.0/lib/加载~/gems/david-rb-0.1.0/code/而不会引发错误。

© www.soinside.com 2019 - 2024. All rights reserved.