【问题标题】:Ruby: require works in gem, fails when running from sourceRuby:需要在 gem 中工作,从源代码运行时失败
【发布时间】:2017-09-17 07:55:46
【问题描述】:

尝试基于bundler's official guide on developing a Ruby gem 创建gem。

运行bundle gem foodie会在lib目录下创建结构并生成文件:

  • 美食家
    • version.rb
  • foodie.rb

foodie.rb 读取

require "foodie/version"

module Foodie
  # Your code goes here...
end

运行ruby lib/foodie.rb(或者也从不同的目录)将导致

C:/Ruby23-x64/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- foodie/versio
n (LoadError)
        from C:/Ruby23-x64/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from foodie.rb:1:in `<main>'

另一方面,通过rake install 安装 gem,然后要求 gem 工作正常。

如果 require "foodie/version" 在 foodie.rb 中更改为 require_relative "foodie/version",它将从源代码中工作。据我了解

  • require 基于模块工作
  • require_relative 基于目录结构工作

对我来说,后者看起来像一个黑客。通过模块构建代码不再有意义,因为它不会被强制执行(也许它仍然有意义,但你可能会犯错误并且永远不会注意到)。

我的问题是:

  • 是否可以在遵循捆绑程序约定的情况下从源代码测试 gem 而无需安装它(使用 require 而不是 require_relative)?
  • 为什么 gem 安装后可以工作?
  • requirerequire_relative、模块、文件和一般结构的使用是否有最佳实践?

谢谢。

【问题讨论】:

  • 请将其分解为单独的问题,因为:1. 您提出的三个问题完全不同,2. 这样对未来的读者更有用。谢谢!
  • 感谢您的反馈。我这样问是因为这些问题来自同一个问题/背景——我想其他人在类似的情况下也会有类似的问题。我认为每个问题都需要相同的上下文。对几个问题重复相同的上下文是否是一种好习惯?

标签: ruby rubygems require directory-structure code-structure


【解决方案1】:

您需要将 lib 目录添加到 Ruby 的 加载路径。加载路径是当您调用require 时Ruby 在其中搜索文件的目录列表。 Rubygems 还可以在您使用 gem 时管理加载路径,这就是您的代码在作为 gem 安装时可以工作的原因。

您说“据我所知...require 基于模块工作”,这是不正确的。 require 与文件一起使用,只是约定类或模块在具有匹配名称的文件中定义,例如MyModule 可能在 my_module.rb

有几种方法可以将目录添加到加载路径。您可以在命令行中使用-I 选项:

$ ruby -I lib lib/foodie.rb

如果您想避免输入-I lib,您可以使用RUBYLIB 环境变量。 Ruby 将 this 的内容添加到加载路径中:

$ export RUBYLIB=lib
$ ruby lib/foodie.rb

(在 Windows 上,我认为您需要使用 set 而不是 export。)

您还可以通过程序本身来操纵加载路径。它存储在全局变量$LOAD_PATH 中,别名为:$。这就是 Rubygems 和 Bundler 管理您的 gem 的方式。

【讨论】:

  • 谢谢!两个评论/问题: 1,我的假设是,即使您在单个文件中定义了多个模块和类,您也可以选择只需要某个类(例如 require A/B/C 在单个文件中具有以下结构:module A module B class C ... end end end) .有没有办法做到这一点? 2,对我来说,require_relativerequire 相同,只是前者具有扩展功能,因此应该首选。您是否同意这一点,或者通常使用require_relative 而不是require 有什么缺点?
猜你喜欢
  • 1970-01-01
  • 2013-07-20
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多