【发布时间】: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 安装后可以工作?
-
require、require_relative、模块、文件和一般结构的使用是否有最佳实践?
谢谢。
【问题讨论】:
-
请将其分解为单独的问题,因为:1. 您提出的三个问题完全不同,2. 这样对未来的读者更有用。谢谢!
-
感谢您的反馈。我这样问是因为这些问题来自同一个问题/背景——我想其他人在类似的情况下也会有类似的问题。我认为每个问题都需要相同的上下文。对几个问题重复相同的上下文是否是一种好习惯?
标签: ruby rubygems require directory-structure code-structure