【问题标题】:Rails engines depending application code?Rails 引擎取决于应用程序代码?
【发布时间】:2010-08-24 14:28:25
【问题描述】:

我怀疑我们有一个不寻常的设置。我们有一个 Rails 应用程序,这是我们卖给客户的东西。我们还将业务功能捆绑包打包成可选插件,客户可以根据需要购买这些插件。我们将这些作为 Rails 插件/引擎完成,以保持它们很好地分开。

这强制要求我们所有的业务插件都依赖于应用程序本身。换句话说,框架位于 Rails 应用程序主文件夹中,而业务模块位于供应商/插件中。换句话说,如果它们依赖于特定的应用程序文件夹,它们几乎不是插件。还是他们?

这确实有效,所以我的问题是出于对架构的好奇,而不是请求帮助。但这应该被认为是对插件/引擎系统的滥用吗?或者这是 Rails 引擎的潜在有用应用之一?

布兰登。

【问题讨论】:

    标签: ruby-on-rails plugins


    【解决方案1】:

    我看不出具有依赖项的插件有什么问题,只要这些是合格且易于理解的。没有 Rails,Rails 插件就什么都不是,而且通常需要特定版本。

    糟糕的设计是有一个插件,如果它不能正确加载,它会破坏应用程序,而不是产生某种有用的消息。例如,您可能会先测试环境,然后再以脚先行的方式启动。

    执行此操作的一种非常暴力的方式,但至少提供反馈,可能就像在您的插件的初始化程序中这样:

    unless (defined?(MyApp))
      raise "MyAppPlugin requires MyApp to be installed"
    end
    

    您可以通过为您的应用制作私有 gem 并更正式地设置要求来更优雅地做到这一点。新的 Bundler 系统使这成为可能。

    【讨论】:

    • 感谢您的回复。我认为我们正在做的事情可能很好,只是很不寻常。我会无耻地承认我正在使用 RubyMine 作为 IDE,并且它确实将依赖项的范围限定为仅在一个方向上工作,这开始让我怀疑他们是否在做某事。但我想这是铁轨的方式。所有一个大汤都通过 Rails 加载路径在两个方向上连接在一起。
    • 在混乱的依赖链和优雅的依赖链之间有一条细线。大多数情况下,差异在于当事情无法解决时产生的错误消息。一个设计良好的系统会给你一个提示,而不仅仅是一个堆栈跟踪。我认为,Passenger 在安装前测试您的环境方面做得非常出色,如果出现问题,还可以为您提供特定的解决路径,通常是为您的系统定制的命令,您可以剪切和粘贴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多