如何在路径中自动包含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] 

PS

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

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

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

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

 'some string'.sleep 1000 

这毫无意义。 sleep与弦乐无关; 它不以任何方式依赖它。 它应该只用隐式接收器调用,好像self概念不存在。

将您的方法设为私有并扩展Kernel可帮助您获取该消息。


你可以在foo.rb做到这foo.rb

 module Foo # … end Some::Class.send :include, Foo 

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

你试过吗?

 Object.send(:include,Foo) 

要么

 self.send(:include,Foo) 

在你的控制台内