首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Gemfile在Rails 3应用程序中自动加载gemspec依赖项

如何使用Gemfile在Rails 3应用程序中自动加载gemspec依赖项
EN

Stack Overflow用户
提问于 2011-08-06 01:13:40
回答 4查看 4.9K关注 0票数 11

我有一个Rails 3应用程序,我正在把它变成一个Rails引擎/ gem。这个引擎有一些gem依赖项,我把它们放在它的.gemspec文件中。

我已经创建了一个新的'parent‘Rails 3应用程序,我想将我的引擎gem添加到Gemfile中,并让gem的依赖项自动’加载‘,但这对我不起作用!bundle install可以很好地安装gem依赖项,但当我启动服务器时,应用程序崩溃,因为它们没有加载。

例如,我的引擎的gemspec包含以下几行:

代码语言:javascript
复制
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中包含以下行:

代码语言:javascript
复制
source 'http://rubygems.org'

gem 'my_engine', :path => "~/src/gems/my_engine"

但我得到以下错误:

代码语言:javascript
复制
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。

有人有什么建议吗?我需要改变我的引擎的加载方式吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-07 20:46:54

在main Rails应用程序启动期间,Bundler只需要Gemfile中直接列出的依赖项,而不需要任何子依赖项。你的库/引擎有责任在需要它的时候请求它的依赖项。你可以在你的中使用初始化器来做到这一点。

代码语言:javascript
复制
class MyRailtie < Rails::Railtie
  initializer "require stuff" do
    require "stuff"
  end
end
票数 12
EN

Stack Overflow用户

发布于 2014-01-23 04:16:15

在我们的Rails引擎中,我们使用了一个小技巧来自动要求依赖项。不幸的是,您不能指定是否应该在.gemspec中加载它们,这将允许更好的控制。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2011-08-06 16:19:38

我正在研究Spree ( Rails引擎的超级英雄!),他们在spree_core-0.60.1/lib/spree_core.rb中做到了这一点

代码语言:javascript
复制
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依赖项。好吧,这就是我现在要做的。但如果这一点在未来发生变化,请发表评论。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6960078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档