如果 gem 源指定为 git,则 ActiveMerchant ActionView 帮助程序初始化崩溃,但如果它是默认路径或本地路径则有效

Posted

技术标签:

【中文标题】如果 gem 源指定为 git,则 ActiveMerchant ActionView 帮助程序初始化崩溃,但如果它是默认路径或本地路径则有效【英文标题】:ActiveMerchant ActionView helper initializiation crashes if gem source specified as git, but works if it is default or local path 【发布时间】:2014-05-31 05:53:10 【问题描述】:

我有一个奇怪的错误,这取决于我如何在 Gemfile 中指定 gem。

如果我使用标准gem作为没有问题

gem 'activemerchant'

或从路径中加载它

gem 'activemerchant', path: '/home/alexd/src/active_merchant'

但是如果我从 git 加载它,就像在

中一样
gem 'activemerchant', git: 'https://github.com/Shopify/active_merchant'

那么下面的代码会在运行 rspec 时导致崩溃

config/initializers/active_merchant.rb

ActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)

堆栈跟踪

/home/alexd/.rvm/gems/ruby-1.9.3-p545@app/bundler/gems/active_merchant-09ec2cbcfe96/lib/active_merchant/billing/integrations/action_view_helper.rb:8:in `<module:Integrations>': can't convert Pathname into String (TypeError)
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/bundler/gems/active_merchant-09ec2cbcfe96/lib/active_merchant/billing/integrations/action_view_helper.rb:5:in `<module:Billing>'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/bundler/gems/active_merchant-09ec2cbcfe96/lib/active_merchant/billing/integrations/action_view_helper.rb:4:in `<module:ActiveMerchant>'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/bundler/gems/active_merchant-09ec2cbcfe96/lib/active_merchant/billing/integrations/action_view_helper.rb:3:in `<top (required)>'
    from /home/alexd/app/app/config/initializers/active_merchant.rb:5:in `<top (required)>'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/activesupport-3.2.17/lib/active_support/dependencies.rb:245:in `load'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/activesupport-3.2.17/lib/active_support/dependencies.rb:245:in `block in load'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/activesupport-3.2.17/lib/active_support/dependencies.rb:236:in `load_dependency'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/activesupport-3.2.17/lib/active_support/dependencies.rb:245:in `load'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/engine.rb:593:in `block (2 levels) in <class:Engine>'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/engine.rb:592:in `each'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/engine.rb:592:in `block in <class:Engine>'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/initializable.rb:30:in `instance_exec'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/initializable.rb:30:in `run'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/initializable.rb:54:in `each'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/initializable.rb:54:in `run_initializers'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/application.rb:136:in `initialize!'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/railties-3.2.17/lib/rails/railtie/configurable.rb:30:in `method_missing'
    from /home/alexd/app/app/config/environment.rb:7:in `<top (required)>'
    from /home/alexd/app/app/spec/spec_helper.rb:9:in `require'
    from /home/alexd/app/app/spec/spec_helper.rb:9:in `<top (required)>'
    from /home/alexd/app/app/spec/controllers/abuse_report_controller_spec.rb:2:in `require'
    from /home/alexd/app/app/spec/controllers/abuse_report_controller_spec.rb:2:in `<top (required)>'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/rspec-core-2.14.7/lib/rspec/core/configuration.rb:896:in `load'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/rspec-core-2.14.7/lib/rspec/core/configuration.rb:896:in `block in load_spec_files'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/rspec-core-2.14.7/lib/rspec/core/configuration.rb:896:in `each'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/rspec-core-2.14.7/lib/rspec/core/configuration.rb:896:in `load_spec_files'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/rspec-core-2.14.7/lib/rspec/core/command_line.rb:22:in `run'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/rspec-core-2.14.7/lib/rspec/core/runner.rb:80:in `run'
    from /home/alexd/.rvm/gems/ruby-1.9.3-p545@app/gems/rspec-core-2.14.7/lib/rspec/core/runner.rb:17:in `block in autorun'

更新

config/initializers/active_merchant.rb中的简单需求也可以触发崩溃:

require 'active_merchant/billing/integrations/action_view_helper.rb'

并且看起来它是由路径长度引起的。如果我需要具有较短路径名的模块 - 它可以工作:

require 'active_merchant/billing/integrations/moneybookers.rb'

任何具有较长路径名的模块也会导致崩溃 - 也发生在崩溃之后

require 'active_merchant/billing/integrations/paypal_payments_advanced.rb

【问题讨论】:

试试这篇博文中提到的:blog.nikosd.com/2011/11/… 你确定github版本和你本地的一样吗? @fotanus 是的,它们是一样的。 你使用的是哪个版本,为什么要添加github repo? 【参考方案1】:

我认为 gem 的 URL 必须采用 git://github.com/username/repo_name 格式 .git

所以对于你的例子:

gem 'activemerchant', :git => 'git://github.com/Shopify/active_merchant.git'

来自http://bundler.io/v1.3/man/gemfile.5.html

GIT (:git) 如有必要,您可以指定 gem 位于 特定的 git 存储库。存储库可以是公共的 (http://github.com/rails/rails.git) 或私人 (git@github.com:rails/rails.git)。如果存储库是私有的,则 用于运行 bundle install 的用户必须具有适当的密钥 在他们的 $HOME/.ssh 中可用。

Git 存储库使用 :git 参数指定。群组, 平台,并且需要选项可用并且行为与 和普通宝石一样。

gem "rails", :git => "git://github.com/rails/rails.git"

这适用于我的 Rails 3.2.16 应用程序。

另外,您似乎可以使用 :github 速记来表示公共回购:

GITHUB (:github) 如果您要使用的 git 存储库托管在 GitHub 并且是公开的,可以使用 :github 简写来指定 只是 github 用户名和存储库名称(没有尾随 ".git"),用斜杠分隔。如果用户名和存储库 名称相同,可以省略一个。

gem "rails", :github => "rails/rails"

gem "rails", :github => "rails"

都等价于

gem "rails", :git => "git://github.com/rails/rails.git"

【讨论】:

嗯...它适用于我的 Rails 3.2.16 应用程序,您提到的参考建议以这种方式格式化 URI。 您是否阅读过您从文档中引用的第一段的第二句?我使用 git:// 和 https:// 两种方式进行了测试,但我们需要使用 https:// 因为我们的开发人员之一有时在防火墙后面。是的,如果我使用完全相同的 Gemfile 创建新应用程序,但只有一个用于 ActiveMerchant 的相关初始化程序和仅用于模型/控制器的脚手架代码,它不会崩溃。 您使用的是什么版本的 Rails?会不会是语法?即gem 'activemerchant', git: 'https://github.com/Shopify/active_merchant'gem 'activemerchant', :git =&gt; 'git://github.com/Shopify/active_merchant.git'git::git =&gt; 我认为 gem 源 URL 或 Gemfile 的语法没有问题。相同的 Gemfile 与新创建的应用完美配合。【参考方案2】:

升级到 ruby​​ 2.x 解决了这个问题,但我仍在寻找适用于 1.9.3 的解决方案,因为我还没有准备好将整个应用程序迁移到 ruby​​ 2.x。

【讨论】:

以上是关于如果 gem 源指定为 git,则 ActiveMerchant ActionView 帮助程序初始化崩溃,但如果它是默认路径或本地路径则有效的主要内容,如果未能解决你的问题,请参考以下文章

cocopods 镜像源更新 时间 2018年07月份

用于开发的本地 Gem 路径和用于生产的远程 Git 存储库

使用 bundler,如何解压通过 git 存储库安装的 gem?

如何指定要从私有 github 存储库中提取的 gem?

Gemfile 中的 Ruby Bundler 多个源

数据绑定为Binding指定绑定源的几种方法