【问题标题】:Require gem dependency for rails engine development (with bundler config.local)Rails 引擎开发需要 gem 依赖项(使用 bundler config.local)
【发布时间】:2013-12-30 18:55:08
【问题描述】:

我正在为我开发的 spree 2.1 应用程序(也是 rails 4)开发一个 rails 4 引擎(宝石名称:tax_cloud_for_spree)。这个新引擎依赖于“tax_cloud”gem。我不能要求这种依赖;尝试启动 rails 服务器会产生:

/Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/polyglot-0.3.3/lib/polyglot.rb:63:in `require': cannot load such file -- tax_cloud (LoadError)
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/polyglot-0.3.3/lib/polyglot.rb:63:in `require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `block in require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require'
    from /Users/jackryon/Documents/rails_dev/tax_cloud_for_spree/lib/tax_cloud_for_spree/engine.rb:1:in `<top (required)>'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/polyglot-0.3.3/lib/polyglot.rb:63:in `require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/polyglot-0.3.3/lib/polyglot.rb:63:in `require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `block in require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:228:in `require'
    from /Users/jackryon/Documents/rails_dev/tax_cloud_for_spree/lib/tax_cloud_for_spree.rb:1:in `<top (required)>'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/bundler-1.3.5/lib/bundler/runtime.rb:72:in `require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/bundler-1.3.5/lib/bundler/runtime.rb:72:in `block (2 levels) in require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/bundler-1.3.5/lib/bundler/runtime.rb:70:in `each'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/bundler-1.3.5/lib/bundler/runtime.rb:70:in `block in require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/bundler-1.3.5/lib/bundler/runtime.rb:59:in `each'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/bundler-1.3.5/lib/bundler/runtime.rb:59:in `require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/bundler-1.3.5/lib/bundler.rb:132:in `require'
    from /Users/jackryon/Documents/rails_dev/purible2/config/application.rb:7:in `<top (required)>'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/railties-4.0.0/lib/rails/commands.rb:76:in `require'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/railties-4.0.0/lib/rails/commands.rb:76:in `block in <top (required)>'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/railties-4.0.0/lib/rails/commands.rb:73:in `tap'
    from /Users/jackryon/.rvm/gems/ruby-2.0.0-p247@purible2/gems/railties-4.0.0/lib/rails/commands.rb:73:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

我目前需要在“lib/tax_cloud_for_spree/engine.rb”文件顶部添加 tax_cloud gem,并且 gemspec 添加了运行时依赖项,例如:

Gem::Specification.new do |s|
  ...
  s.add_runtime_dependency "tax_cloud", "0.2.2"
end

我的 require 似乎无法加载来自 tax_cloud 的 lib 目录。我正在使用 bundle config.local 将我的引擎路径设置为本地 git 存储库,同时我正在积极开发它。

运行“bundle show tax_cloud_for_spree”节目

~/Documents/rails_dev/tax_cloud_for_spree

并捆绑显示 tax_cloud 提供

~/Documents/rails_dev/tax_cloud_for_spree

因此,tax_cloud gem 似乎已成功安装在此 gemset 中,并且可以被要求使用。

我需要调用一些 config.autoload_paths 吗,或者我可以阻止一个初始化器挂钩来要求这个 gem?

另一个注意事项是,如果我将 tax_cloud gem 直接添加到父应用程序的 gemfile 中,我就可以启动服务器。不过,出于显而易见的原因,我更愿意让我的引擎管理自己的依赖项。我是否应该考虑编写一个生成器来将 gem 添加到父应用程序的 gemfile 中?这种方法似乎也很笨拙。

非常感谢您对此的任何帮助。

编辑

我认为我的困境的症结在于:
是否有可能需要来自 rvm gemset 的捆绑 gem..
进入一个路径到 config.local 路径的 gem..
然后加载到 Rails 应用程序中?

这将使在我的应用程序上下文中开发 gem 成为可能,同时利用第三方 gem。有人吗?

【问题讨论】:

    标签: ruby-on-rails-4 gem bundler spree rails-engines


    【解决方案1】:

    我正在使用 bundle config.local 将我的引擎路径设置为本地 git 存储库,同时我正在积极开发它。

    这是对正常 Rubygems 行为的特定于 Bundler 的扩展。 Rubygems 对此一无所知,因此当它安装您的引擎时,它将使用正常的 Rubygems 依赖解析过程并期望在 ruby​​gems.org 上找到tax_cloud

    做你想做的事的唯一方法就是你已经发现:将tax_cloud gem 直接添加到你的应用程序的Gemfile

    【讨论】:

    • 谢谢,蒂姆。我发现对我来说最好的办法就是使用 :path => "/local/dir" 在我的 gemfile 中设置开发中的 gem 的路径。我只需要记住在将其部署到我的登台/生产环境之前将其切换回 github URL。使用 pathed gem 位置,rubygems 能够解析依赖项,我不需要将子依赖项添加到父应用程序的 gemfile。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多