两个选项都会生成一个engine,不同之处在于--mountable
将在隔离的命名空间中创建引擎,而--full
将创建共享主应用程序命名空间的引擎。
这些差异将通过3种方式体现:
1)引擎类文件将调用isolate_namespace
:
lib/my_full_engine/engine.rb:
module MyFullEngine
class Engine < Rails::Engine
end
end
lib/my_mountable_engine/engine.rb:
module MyMountableEngine
class Engine < Rails::Engine
isolate_namespace MyMountableEngine
end
end
2) 引擎的config/routes.rb
文件将被命名空间化:
完整引擎:
Rails.application.routes.draw do
end
安装的引擎:
MyMountableEngine::Engine.routes.draw do
end
3)控制器、帮助程序、视图和资产的文件结构将被命名空间化:
创建 app/controllers/my_mountable_engine/application_controller.rb
创建 app/helpers/my_mountable_engine/application_helper.rb
创建 app/mailers create app/models
创建 app/views/layouts/my_mountable_engine/application.html.erb
创建 app/assets/images/my_mountable_engine
创建 app/assets/stylesheets/my_mountable_engine/application.css
创建 app/assets/javascripts/my_mountable_engine/application.js
创建 config/routes.rb 创建 lib/my_mountable_engine.rb
创建 lib/tasks/my_mountable_engine.rake
创建 lib/my_mountable_engine/version.rb
创建 lib/my_mountable_engine/engine.rb
说明
--full
选项的使用场景似乎非常有限。个人来看,我想不出任何好的理由为什么要把代码分离成引擎而不隔离命名空间- 实际上这只是给你两个紧密耦合的应用程序,共享相同的文件结构和所有冲突和代码泄漏。
我见过的每一篇文档都演示了 --mountable
选项,实际上当前的 edge guide 强烈建议您包括隔离命名空间——这意味着使用 --mountable
而不是 --full
。
最后,存在术语混淆:不幸的是 rails plugin -h
显示以下描述:
[--full] # 生成带有捆绑Rails应用程序进行测试的 Rails引擎
[--mountable] # 生成可装载的隔离应用程序
这给人留下了这样的印象:您使用 --full
创建一个“引擎”,使用 --mountable
创建另一种称为“可挂载应用程序”的东西,而事实上它们都是引擎-一个已命名空间化,一个没有。这必定会导致用户困惑,因为寻找创建引擎的用户很可能会认为 --full
是更相关的选项。
结论
rails plugin new something --full
= 将引擎嵌入到您的应用程序命名空间中。(为什么要这样做?)
rails plugin new something --mountable
= 具有自己命名空间的引擎。(非常棒)
参考资料
mount MyEngine::Engine => "/"
。这对于资源是有效的,也许对于引擎也是如此。 - Benoit Garret