0

我正在尝试使用 Bundler 创建一个 gem,遵循本指南:http ://rakeroutes.com/blog/lets-write-a-gem-part-one/ 。其中,它说:

在我第一次浏览 gemspec 之后,我错误地认为我需要在开发我的 gem 时添加更多的 require 语句。情况并非如此:文件只需要在 git 中。

我正在尝试清理我的一些旧 gem 以使用此约定,但是当我安装我的 gem 时,其他文件中的类不可用。我的 /lib 目录下嵌套了几个目录,但我认为这不是问题。有什么容易忽略的东西会阻止需要我的其他文件吗?任何帮助,将不胜感激。

4

1 回答 1

1

在链接中,当他说他不需要添加很多“require”语句时,他的意思是向 、 和数组添加文件s.files——s.executables这些s.test_files决定了哪些文件被打包到 gem 中,哪些文件被忽略. 正如您从 gem 规范中看到的那样,git 在某些目录中跟踪的任何内容都将包含在打包的 gem 中。

Ruby 的require情况则不同。标准要求规则仍然适用。

Ruby 的 gem 系统通过添加一堆不同的位置让 Ruby 在运行时查找“foo.rb”来工作require "foo"。如果"lib"是您的 gem 的唯一需要路径,那么当您require "my_gem"Ruby 只打算运行lib/my_gem.rb中的代码时。如果lib/my_gem.rb在你的 gem中没有require任何其他文件,那么 Ruby 没有看到它们,所以当你尝试使用这些文件中的类时,你会得到未定义的常量错误。

例如,你可以看看我写的两个简单的 gem;两者都是从HashToHiddenFieldsbundle gem和SimpleStats 开始的。在这两个 gem 中,lib/中的主 Ruby 文件需要加载所有需要加载的 gem 才能正常工作。例如,hash_to_hidden_​​fields.rb需要action_view/helpers/hash_to_hidden_​​fields以便常量+模块存在,因此我们可以将其包含到.ActionView::Helpers::HashToHiddenFieldsActionView::Base

希望能回答这个问题。我知道 Ruby 要求有一段时间对我来说非常模糊。

于 2012-04-23T08:31:03.283 回答