Rails引擎 - Gems依赖项,如何将它们加载到应用程序中?

Tia*_*ago 47 gem dependencies rails-engines ruby-on-rails-3

我在这里做引擎,它可以独立工作.

当我将它转换为gem并将其加载到另一个应用程序中时,我得到了许多未定义的错误,来自我的引擎gem的依赖.

这是gemspec:

s.add_dependency('paperclip')
s.add_dependency('jquery-rails')
s.add_dependency('rails3-jquery-autocomplete')
s.add_dependency('remotipart')
s.add_dependency('cancan')
Run Code Online (Sandbox Code Playgroud)

在应用程序中,当我进行bundle安装时,它列出了所有这些依赖项,但是当我运行应用程序时,我收到了很多未定义的方法错误(例如来自paperclip的has_attachment).似乎应用程序不加载引擎依赖项.这是默认行为吗?我可以改变吗?引擎内部的插件也发生了同样的事情.

如果我手动插入那些宝石,在应用程序Gemfile中,所有工作......

Dan*_*urg 76

将它们包含在gemfile中并运行bundle install.然后在你的需要他们lib/<your_engine>/engine.rb file.别忘了要求rubygems

  require 'rubygems'
  require 'paperclip'
  require 'jquery-rails'
  require 'rails3-jquery-autocomplete'
  require 'remotipart'
  require 'cancan'
Run Code Online (Sandbox Code Playgroud)

然后在你的主机应用程序(你包含你的宝石的应用程序)运行捆绑安装/捆绑更新(捆绑更新为我做了伎俩)然后一切都应该完美.您也可以通过在主机应用程序中启动控制台来测试它,只需输入模块名称即可

Loading development environment (Rails 3.0.3)
irb(main):001:0> Paperclip
=> Paperclip
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • @orangechicken - 我认为(可能是错的)你的引擎/插件责任要求任何依赖.哪个也应该包含在gemspec中.我认为Gemfile仅用于开发目的. (4认同)
  • OP的目的是*不要求使用引擎在应用程序的Gemfile中添加依赖项.(我对插件有同样的问题.)Gem都出现在Gemfile.lock中,但它们似乎并没有被Rails自动加载. (3认同)
  • @Kris:是的,这似乎也是我的发现.引擎被视为普通的宝石,宝石必须将它们的依赖项放在.gemspec文件中. (2认同)
  • @DaniëlZwijnenburg,第二次要求他们并不奇怪吗?它们曾在Engins的`.gemspec`文件中声明为依赖项.所以他们必须加载到托管应用程序,而无需任何额外的`require`命令.但他们不是. (2认同)

car*_*ini 23

你可以像Daniel发布的那样手动要求它们,你也可以自动要求它们.您需要在3个文件中添加依赖项:

更新:这是如何要求依赖项的简单演示.您应该测试它并过滤不需要的项目,例如:require d.name除非d.type ==:development(thx @ imsinu9)

  • 这很漂亮.不幸的是,一些gem有不同的命名约定,因此`require d.name`将失败并出现`LoadError`,所以你可能需要做一些救援. (3认同)