我有一个包含以下内容的Rakefile:
namespace :geo_data do
desc 'Imports geo data to Heroku'
task :heroku_import => :environment do
system "heroku pg:psql DATABASE -c 'DELETE FROM <table name>' -a <heroku app name>"
# some more stuff...
end
end
每当我运行rake geo_data:heroku_import
时,它会因我的Heroku命令崩溃而出现此错误:
您的Ruby版本是1.9.3,但您的Gemfile指定为2.2.2
但是,如果我直接从终端窗口的命令行运行Heroku命令 - heroku pg:psql DATABASE -c 'DELETE FROM <table name>' -a <heroku app name>
,它可以正常工作。
所以看起来system
命令正在使用不同版本的Ruby。
有趣的是,就我所知,我甚至没有在我的机器上安装1.9.3
。这是rvm list
:
rvm rubies
ruby-2.0.0-p598 [ x86_64 ]
ruby-2.2.0 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
根据该输出,我没有安装1.9.3
,2.2.2
被设置为我当前的和默认Ruby版本。
我确定system
使用的是不同版本的Ruby,还是我还缺少其他东西?如果它使用的是其他版本,我怎样才能使用2.2.2
(或者最好当前设置的 )?
这是我的Gemfile的内容:
source 'https://rubygems.org'
ruby '2.2.2'
gem 'rails', '4.2.3'
gem 'rails-api'
gem 'spring', :group => :development
gem 'pg'
gem 'stripe'
gem 'jsonapi-resources', '0.7.0'
gem 'rails_api_auth'
gem 'rack-cors', require: 'rack/cors'
gem 'activerecord-postgis-adapter'
gem 'rgeo-geojson'
gem 'geocoder'
gem 'activerecord-import'
gem 'sidekiq'
gem 'unicorn'
group :development, :test do
gem 'rspec-rails'
gem 'forgery'
gem 'foreman'
end
group :development do
gem 'pry-rails'
end
答案 0 :(得分:2)
Ruby会在启动时检查一些环境变量,您可以使用这些变量来控制加载路径和设置选项等内容。
Bundler具有“传染性”,因为当你使用它时它会添加一些这些环境变量,这样另一个作为子进程执行的Ruby进程会自动尝试使用具有相同Gemfile
的Bundler。
使用Bundler将ruby -e "puts ENV.inspect"
的输出与项目内的bundle exec ruby -e "puts ENV.inspect"
进行比较。
这通常是您想要发生的事情,因此您始终使用Gemfile
中定义的Gems和Ruby版本。
heroku
命令包含自己的Ruby安装(它在我的机器上的/usr/local/heroku/ruby
中),而不是普通版本。这是Ruby的旧版本,我的版本是1.9.3p194。
因此,当您使用system
运行heroku
命令时,创建的Ruby进程会检查环境变量并加载Bundler(使用您正在使用的Ruby版本中的Gem)和然后尝试根据您的Gemfile
设置所有内容。这就是Ruby版本不匹配的地方。
要解决此问题,您需要告诉Bundler在启动子进程时不要包含各种环境变量。有一些方法可以解决这个问题,在您的情况下,您希望使用Bundler.clean_system
而不是普通system
:
Bundler.clean_system "heroku pg:psql DATABASE -c 'DELETE FROM <table name>' -a <heroku app name>"
这将允许Heroku客户端在不受Bundler和您的Gemfile
干扰的情况下运行。
答案 1 :(得分:0)
答案 2 :(得分:0)
看看How to fix "Your Ruby version is 1.9.3, but your Gemfile specified 2.0.0"。
尝试ruby -v
我通过运行rvm install 2.2.2
来解决这个问题。