Rails引擎:何时将代码放入应用程序,何时放入lib,以及何时放入供应商文件夹?

Jos*_*eim 11 ruby ruby-on-rails rails-engines

我正在开发一个Rails引擎,所以我对现有的引擎进行了一些研究.我注意到,其中不乏有在文件中app,而且在libvendor.

我很清楚,我应该将任何应该由主机应用程序替换的代码放入app文件夹中(例如,当拥有模型时app/user.rb,主机应用程序可以轻松拥有自己的app/user.rb文件并使用此文件而不是引擎程序).

但我不确定,当我必须把东西放进去lib,什么时候进去vendor?我想,在vendor那里,我只应该把其他开发人员或项目中的"外部"代码放在我想要在我的项目中使用的代码中,并且lib我将自己的其他库放在项目中.但是,例如,为什么WiceGrid会将内容放入其wice_grid/vendor/assets目录中?它看起来不像外部代码,但是只为WiceGrid开发的代码应该在lib目录中?

更新

在尝试一下时,我注意到lib在开发引擎时没有重新加载文件夹中的所有代码(我猜这个vendor目录的情况也是如此),所以我应该将它们放入一个文件夹中app,但究竟在哪里呢?

例如,我有一个文件lib/iq_list_controller.rb,其中包含一些类和实例方法ApplicationController,我将其混合到其中,engine.rb如下所示:

initializer "wice_grid_railtie.configure_rails_initialization" do |app|
  ActiveSupport.on_load(:action_controller) do
    extend  IqList::Controller::ClassMethods
    include IqList::Controller::InstanceMethods
  end
end
Run Code Online (Sandbox Code Playgroud)

我应该把这个文件放在哪里,以便Ruby正确找到它?

And*_*ggs 6

关于开发重新加载问题,如果lib文件夹是文件的自然主页,则将其添加到Rails的加载路径,例如:

module MyEngine
  class Engine < ::Rails::Engine
    config.autoload_paths << File.expand_path("../../lib", __FILE__)
  end
end
Run Code Online (Sandbox Code Playgroud)

关于供应商资产的具体情况,将引擎的资产放在应用程序/资产中似乎是合理的,主机Rails应用程序可以找到它们.