Ruby on rails 3 Rails引擎-Gems依赖项,如何将它们加载到应用程序中?
我在这里做一个引擎,它可以独立工作 当我将它转换为gem,并将其加载到另一个应用程序中时,我得到了许多未定义的错误,这些错误来自于我的引擎gem的依赖性 以下是gemspec: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
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
,以避免加载开发依赖项。