首页 文章

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

提问于
浏览
46

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

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

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

如果我手动插入那些宝石,在应用程序Gemfile中,所有工作......

7 回答

  • 0

    将它们包含在gemfile中并运行bundle install . 然后在 lib/<your_engine>/engine.rb file 中要求它们 . 别忘了要求rubygems

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

    然后在你的主机应用程序(你包含你的宝石的应用程序)运行捆绑安装/捆绑更新(捆绑更新为我做了伎俩)然后一切都应该完美 . 您还可以通过在主机应用中启动控制台来测试此操作,然后输入模块名称,例如

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

    希望这可以帮助

  • 75

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

    • yourengine.gemspec
    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
    

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

  • 0

    来自paperclip的README

    对于非Rails用法:

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

    我有同样的问题,并为我修复它 .

  • 1

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

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

    我想你还需要将gem添加到rails引擎Gemfile和bundle install中,但我不确定你是否需要它 .

  • 2

    目前(我认为Rails 3.1及以上版本),你不应该再在test / dummy / Gemfile中声明任何gems:

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

    在simple_view_helpers.gemspec中声明gem的依赖项 . Bundler将处理运行时依赖性,如基本依赖性,默认情况下,开发依赖项将添加到:development组 . 声明仍在开发中的任何依赖项,而不是在gemspec中 . 这些可能包括路径或Git中的边缘Rails或宝石 . 在将gem发布到rubygems.org之前,请记住将这些依赖项移到gemspec中 .

  • 23

    你真的不应该在Gemsec上需要它们,它们应该被加载 . 当你说"here is the gemspec"时,你用 Gem::Specification.new do |s| 或其他东西围绕它,对吗?

  • 0

    您可以使用简单的bundler命令包含环境的所有gem:

    Bundler.require(*Rails.groups)
    

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

相关问题