我正在尝试使用Bundler创建一个gem,遵循本指南:http://rakeroutes.com/blog/lets-write-a-gem-part-one/。在其中,它说:
我第一次看完gemspec后错误地想到了 当我开发我的时候,我需要添加更多的需求语句 宝石。事实并非如此:文件只需要在git中。
我正在尝试清理一些旧的宝石以使用此约定,但是当我安装我的gem时,其他文件中的类不可用。我有几个目录嵌套在我的/ lib目录下,但我不认为这将是一个问题。是否有任何简单的方法可以忽略我的其他文件?任何帮助将不胜感激。
答案 0 :(得分:1)
在链接中,当他说他不需要添加大量“require”语句时,他必须意味着将文件添加到s.files
,s.executables
和s.test_files
数组 - 这些确定哪些文件打包到gem中以及哪些文件被忽略。正如您从gem规范中看到的那样,某些目录中git跟踪的内容将包含在打包的gem中。
Ruby的require
是另一回事。标准要求规则仍然适用。
Ruby的gem系统的工作原理是为Ruby添加一堆不同的地方,以便在运行require "foo"
时查找“foo.rb”。如果"lib"
是您的gem的唯一需求路径,那么require "my_gem"
Ruby只会运行 lib / my_gem.rb 中的代码。如果 lib / my_gem.rb 没有require
您的gem中的任何其他文件,那么Ruby没有看到它们,因此当您尝试使用时,您将获得未定义的常量错误这些文件中的类。
例如,你可以看看我写的两个简单的宝石;两者都以bundle gem
:HashToHiddenFields和SimpleStats开头。在这两个gem中, lib / 中的主要Ruby文件需要加载所有需要加载的内容才能使gem正常工作。例如,hash_to_hidden_fields.rb需要 action_view / helpers / hash_to_hidden_fields ,以便ActionView::Helpers::HashToHiddenFields
常量+模块存在,以便我们可以将其包含在ActionView::Base
中。
希望能回答这个问题。我知道Ruby需要在一段时间内对我很模糊。