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

Ruby on rails 3 Rails引擎-Gems依赖项,如何将它们加载到应用程序中?,ruby-on-rails-3,dependencies,gem,rails-engines,Ruby On Rails 3,Dependencies,Gem,Rails Engines,我在这里做一个引擎,它可以独立工作 当我将它转换为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('ca

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

当我将它转换为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')
在应用程序中,当我进行捆绑安装时,它会列出所有这些依赖项,但当我运行应用程序时,我会收到许多未定义的方法错误(例如,有来自曲别针的附件)。应用程序似乎没有加载引擎依赖项。 这是默认行为吗?我能换一下吗? 同样的事情发生在引擎内部的插件上


如果我手动将这些gem插入到应用程序Gemfile中,则所有工作…

将它们包含在您的Gemfile中并运行bundle安装。然后在
lib//engine.rb文件中需要它们。别忘了要求rubygems

  require 'rubygems'
  require 'paperclip'
  require 'jquery-rails'
  require 'rails3-jquery-autocomplete'
  require 'remotipart'
  require 'cancan'
然后在您的主机应用程序(您包含gem的应用程序)中运行bundle install/bundle update(bundle update为我做到了这一点),然后一切都应该正常工作。您也可以通过在主机应用程序中启动控制台并键入模块名称(例如

Loading development environment (Rails 3.0.3)
irb(main):001:0> Paperclip
=> Paperclip
希望这有助于目前(我认为Rails 3.1及以上版本),您不应该再在test/dummy/gem文件中声明任何gem:

引用test/dummy/Gemfile(使用
rails插件new my_引擎生成--full
):

在simple\u view\u helpers.gempec中声明gem的依赖项。 Bundler将运行时依赖项视为基本依赖项,并且 默认情况下,开发依赖项将添加到:development组

在此处而不是在中声明仍在开发中的任何依赖项 你的宝石。这些可能包括您的路径或路径中的边缘轨道或宝石 吉特。请记住在发布之前将这些依赖项移动到您的gemspec 你的宝石到rubygems.org


你真的不应该在gemesc上使用它们,它们应该被加载。当你说“这是gemspec”时,你是在用
Gem::Specification.new do |
或类似的东西围绕它,对吗?

来自曲别针:

对于非轨道使用:

class ModuleName < ActiveRecord::Base
  include Paperclip::Glue
  ...
end
class ModuleName

我也有同样的问题,这为我解决了。

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

  • 你的引擎

    s.add_dependency "rails", '4.1.0'
    s.add_dependency "sqlite3"
    
  • Gemfile

    # Imports dependencies from yourengine.gemspec
    gemspec
    
  • lib/yourengine.rb

    # requires all dependencies
    Gem.loaded_specs['yourengine'].dependencies.each do |d|
     require d.name
    end
    
    require 'yourengine/engine'
    
    module Yourengine
    end
    

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

您必须将gem文件添加到.gempec文件和engine.rb文件中。 在.gemspec文件中,如下所示:
s.add\u依赖项“kaminari”,“0.16.1”

在顶部的engine.rb文件中添加:
需要“kaminari”


我认为您还需要将gem添加到rails引擎Gemfile和bundle安装中,但我不确定您是否需要它。

您可以通过一个简单的bundler命令包含环境的所有gem:

Bundler.require(*Rails.groups)

您可以将其添加到
配置/初始值设定项中

您是否可以在应用程序的Gemfile.lock中看到这些安装?您的引擎Gemfile是否在源代码下方使用“gempec”?如果你的应用程序Gemfile.lock显示这些已安装的依赖项,那么我相信它们应该在应用程序中可用。如果您还没有看到这篇文章,请查看->OP的意图是不需要在使用引擎的应用程序的GEM文件中添加依赖项。(我对一个插件也有同样的问题。)gems都出现在Gemfile.lock中,但它们似乎不是由Rails自动加载的。如果安装了gems,那么就需要在lib//engine.rb文件中加载它们。@orangechicken-我认为(可能错了)需要依赖项是引擎/插件的责任。也应包括在gemspec中。我认为这个文件只是为了开发目的。@克里斯:是的,这似乎也是我的发现。引擎被视为普通的gem,gem必须将其依赖项放在.gemspec文件中。@DaniëlZwijnenburg,第二次需要它们不是很奇怪吗?它们曾经在Engins的
.gempec
文件中声明为依赖项。因此,它们必须加载到托管应用程序中,而无需任何额外的
require
命令。但它们不是。这很整洁。不幸的是,一些gem有不同的命名约定,因此
require d.name
将失败,并出现
LoadError
,因此您可能需要进行一些抢救。最后一个循环也将加载您所有的开发依赖项:(我建议
需要d.name,除非d.type==:development
,以避免加载开发依赖项。