13

我正在开发一个 Rails 引擎,所以我对现有的引擎进行了一些研究。我注意到他们中的许多人app在.lib和. 中都有文件vendor

我很清楚,我应该将主机应用程序可以替换的任何代码放入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

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

4

3 回答 3

6

关于开发重新加载问题,如果 lib 文件夹是您的文件的自然归宿,则将其添加到 Rails 的加载路径中,如下所示:

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

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

于 2013-07-11T10:06:50.960 回答
2

如果您希望自动加载内容,请将它们放入/app. 否则,我认为/lib应该手动要求其中的任何内容。我通常认为自动加载 lib 文件夹是不好的做法。

于 2014-05-28T15:21:16.320 回答
1

您的 MVC 基本代码位于 app 文件夹中。现在假设您有一个经常使用的通用方法/模块,因此要为您的代码实现 DRYness ......所有通用和通用实用程序都可以简单地放在 lib 文件夹中。

有一个很好的解释何时使用 lib在 rails 中使用 lib 文件夹

于 2014-06-10T10:46:47.717 回答