50

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

当我将其转换为 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')

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

如果我在应用程序 Gemfile 中手动插入这些宝石,一切正常......

4

7 回答 7

78

将它们包含在您的 gemfile 中并运行 bundle install。然后在你的lib/<your_engine>/engine.rb file. 不要忘记要求 ruby​​gems

  require 'rubygems'
  require 'paperclip'
  require 'jquery-rails'
  require 'rails3-jquery-autocomplete'
  require 'remotipart'
  require 'cancan'

然后在您的主机应用程序(包含 gem 的应用程序)中运行捆绑安装/捆绑更新(捆绑更新对我有用),然后一切都应该正常工作。您还可以通过在主机应用程序中启动控制台并输入模块名称来测试它,例如

Loading development environment (Rails 3.0.3)
irb(main):001:0> Paperclip
=> Paperclip

希望这可以帮助

于 2011-05-01T18:44:00.993 回答
25

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

  • yourengine.gemspec

    s.add_dependency "rails", '4.1.0'
    s.add_dependency "sqlite3"
    
  • 宝石文件

    # 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
    

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

于 2014-07-15T21:40:12.577 回答
2

来自回形针的自述文件

对于非 Rails 使用:

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

我遇到了同样的问题,并且为我解决了这个问题。

于 2014-05-12T14:27:11.870 回答
2

您必须将 gem 文件添加到 .gemspec 文件和您的 engine.rb 文件中。在 .gemspec 文件中,它会像: s.add_dependency "kaminari", "0.16.1"

在顶部的 engine.rb 文件中添加: require "kaminari"

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

于 2016-01-11T21:38:55.633 回答
0

你真的不应该在 Gemsec 上需要它们,它们应该被加载。当你说“这里是 gemspec”时,你是在用Gem::Specification.new do |s|类似的东西包围它,对吧?

于 2013-01-14T16:47:15.557 回答
0

目前(我认为 Rails 3.1 及更高版本),您不应再在 test/dummy/Gemfile 中声明任何 gem:

引用 test/dummy/Gemfile (使用生成rails plugin new my_engine --full):

在 simple_view_helpers.gemspec 中声明 gem 的依赖项。Bundler 会将运行时依赖项视为基础依赖项,默认情况下会将开发依赖项添加到 :development 组中。

在此处而不是在您的 gemspec 中声明任何仍在开发中的依赖项。这些可能包括边缘 Rails 或来自您的路径或 Git 的 gem。在将 gem 发布到 ruby​​gems.org 之前,请记住将这些依赖项移至 gemspec。

于 2012-09-27T13:36:38.133 回答
0

您可以使用简单的捆绑程序命令包含环境的所有 gem:

Bundler.require(*Rails.groups)

您可以将其添加到config/initializer.

于 2017-01-08T15:44:50.223 回答