如何在路径中自动包含Gem?

时间:2012-06-13 08:34:12

标签: ruby-on-rails ruby ruby-on-rails-3 gem

我有foo.gem,那里有lib/foo.rb

当我向Gemfile添加gem时,我的路径中自动需要foo.rb。但我需要自动包含它。原因是我正在进行控制台扩展,我希望它们在没有我写“include Foo”的情况下可用。

我正在尝试

SOME_CLASS.send(:include, Foo)

但不确定使用哪个类将其添加到路径中,例如当我启动自动包含的控制台时。这里有一些自动包含在控制台中的mixins,我需要我在那里:)谢谢

irb(main):006:0> self.class.included_modules
=> [PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Dependencies::Loadable, Kernel]

P.S。

我可以解决初始化程序的问题,但我不想更改项目的代码我只想添加gem并且它可以工作。

2 个答案:

答案 0 :(得分:1)

你试过吗

Object.send(:include,Foo)

self.send(:include,Foo)
在控制台内

答案 1 :(得分:1)

您应该使用Kernel包含的 Object模块。这是定义exitputsrequire等私有方法的地方,因此它是定义命令式API的绝佳选择。

当您扩展Object时,人们希望能够在任何对象上显式调用您的方法,并且他们也明白您的方法取决于该对象的状态。

Kernel方法理解不同。尽管它们在技术上可用于所有对象,但您不希望人们编写如下内容:

'some string'.sleep 1000

这没有任何意义。 sleep与字符串无关;它不以任何方式依赖它。它应该仅使用隐式接收器调用,就好像self的概念不存在一样。

将您的方法设为私有,并扩展Kernel,以帮助您传达该信息。


您可以在foo.rb

中执行此操作
module Foo
  # …
end

Some::Class.send :include, Foo

当您loadrequire某个文件时,它会逐行执行。您可以将任意代码放在文件中的任何位置,甚至可以放在模块和类定义中。您可以利用这一点来正确设置您的库,以便其他人不必这样做。