如果 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 => 'git://github.com/Shopify/active_merchant.git'
(git:
与:git =>
)
我认为 gem 源 URL 或 Gemfile 的语法没有问题。相同的 Gemfile 与新创建的应用完美配合。【参考方案2】:
升级到 ruby 2.x 解决了这个问题,但我仍在寻找适用于 1.9.3 的解决方案,因为我还没有准备好将整个应用程序迁移到 ruby 2.x。
【讨论】:
以上是关于如果 gem 源指定为 git,则 ActiveMerchant ActionView 帮助程序初始化崩溃,但如果它是默认路径或本地路径则有效的主要内容,如果未能解决你的问题,请参考以下文章
用于开发的本地 Gem 路径和用于生产的远程 Git 存储库