我在DreamHost上开设了一个专用的托管帐户。我部署了一个rails应用程序。我收到了以下错误。
You have already activated rack 1.2.1, but your Gemfile requires rack 1.3.6. Using bundle exec may solve this.
我检查了版本。
$ gem list -d rack
rack (1.2.1, 1.1.0, 1.0.1, 1.0.0)
Author: Christian Neukirchen
Rubyforge: http://rubyforge.org/projects/rack
Homepage: http://rack.rubyforge.org
Installed at (1.2.1): /usr/lib/ruby/gems/1.8
(1.1.0): /usr/lib/ruby/gems/1.8
(1.0.1): /usr/lib/ruby/gems/1.8
(1.0.0): /usr/lib/ruby/gems/1.8
机架1.3.6不存在。但是当我用“捆绑秀”检查它时,它已经安装好了。 (实际上我做了“捆绑安装 - 部署”)
$ bundle show rack
/.../my_rails_app_root/vendor/bundle/ruby/1.8/gems/rack-1.3.6
我有config / setup_load_paths.rb
if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
begin
rvm_path = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
rvm_lib_path = File.join(rvm_path, 'lib')
$LOAD_PATH.unshift rvm_lib_path
require 'rvm'
RVM.use_from_path! File.dirname(File.dirname(__FILE__))
rescue LoadError
# RVM is unavailable at this point.
raise "RVM ruby lib is currently unavailable."
end
end
ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__))
require 'bundler/setup'
其实我找到了解决方案。只是“gem install rack -v 1.3.6”解决了这个问题。
但为什么乘客会拿起系统的机架宝石(或用户的机架宝石)而不是捆绑机架宝石?你怎么避免这个问题?
感谢。
萨姆
答案 0 :(得分:0)
通常,这是您运行应用时所获得的(例如 rails服务器),而不会在命令前加上捆绑执行。
当你运行捆绑安装 - 部署时,bundler从 ./ vendor / cache 获取了你的宝石,并在 ./ vendor / bundle 。从那以后,Bundler知道在哪里找到它们,但你必须通过Bundler运行应用程序。
然而,Rubygems不知道这些宝石的位置,这就是为什么在运行rubygems命令 gem list 时它们不显示的原因。当您使用rubygems安装Rack 1.3.6时,自然会发现rubygems并且您的应用程序开始工作。不使用bundler来启动你的应用程序让rubygems根据它自己的方法满足你的应用程序的要求,这是相当随机的 - 如果你的应用程序当前运行所有相同的宝石,我会很惊讶例如,您运行测试的版本(Eek!)
我通常采用的方法是从服务器卸载所有宝石,安装单个版本的rubygems和bundler,然后完全依赖Bundler来维护我应用程序的宝石。捆绑器的美妙之处在于它计算出一组有效的宝石并可靠地使用它。
希望这有帮助!