我有一个Rails 3应用程序,我正在把它变成一个Rails引擎/ gem。这个引擎有一些gem依赖项,我把它们放在它的.gemspec文件中。
我已经创建了一个新的'parent‘Rails 3应用程序,我想将我的引擎gem添加到Gemfile中,并让gem的依赖项自动’加载‘,但这对我不起作用!bundle install可以很好地安装gem依赖项,但当我启动服务器时,应用程序崩溃,因为它们没有加载。
例如,我的引擎的gemspec包含以下几行:
s.add_runtime_dependency(%q<rails>, ["= 3.0.7"])
s.add_runtime_dependency(%q<acts_as_commentable>, [">= 3.0.1"])
s.add_runtime_dependency(%q<haml>, [">= 3.1.1"])。。父Rails 3应用程序在其Gemfile中包含以下行:
source 'http://rubygems.org'
gem 'my_engine', :path => "~/src/gems/my_engine"但我得到以下错误:
undefined local variable or method `acts_as_commentable'
from /home/user/src/gems/my_engine/app/models/account.rb:66:in `<class:Account>'但是如果我将gem 'acts_as_commentable', '>= 3.0.1'添加到父Rails 3应用程序的Gemfile中,那么gem就会被加载,错误就会消失。
我使用的是Rails 3.0.8。
有人有什么建议吗?我需要改变我的引擎的加载方式吗?
发布于 2011-08-07 20:46:54
在main Rails应用程序启动期间,Bundler只需要Gemfile中直接列出的依赖项,而不需要任何子依赖项。你的库/引擎有责任在需要它的时候请求它的依赖项。你可以在你的中使用初始化器来做到这一点。
class MyRailtie < Rails::Railtie
  initializer "require stuff" do
    require "stuff"
  end
end发布于 2014-01-23 04:16:15
在我们的Rails引擎中,我们使用了一个小技巧来自动要求依赖项。不幸的是,您不能指定是否应该在.gemspec中加载它们,这将允许更好的控制。
Gem.loaded_specs["our_rails_engine"].dependencies.each do |d|
  begin
    require d.name
  rescue LoadError => le
    # Put exceptions here.
    raise le if d.name !~ /factory_girl_rails/
  end
end发布于 2011-08-06 16:19:38
我正在研究Spree ( Rails引擎的超级英雄!),他们在spree_core-0.60.1/lib/spree_core.rb中做到了这一点
require "rails/all"
require 'state_machine'
require 'paperclip'
require 'stringex'
require 'will_paginate'
require 'nested_set'
require 'acts_as_list'
require 'resource_controller'
require 'active_merchant'
require "meta_search"
require "find_by_param"所以答案是,在你的gem中,你必须一个接一个地要求所有的gem依赖项。好吧,这就是我现在要做的。但如果这一点在未来发生变化,请发表评论。
https://stackoverflow.com/questions/6960078
复制相似问题