UNIX`system`命令使用不同版本的Ruby

时间:2015-12-29 16:24:35

标签: ruby shell unix heroku rake

我有一个包含以下内容的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.32.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

3 个答案:

答案 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)

尝试:

bundle exec rake <command>

这会在当前包的上下文中运行rake命令。

更多信息请点击此处:

What does bundle exec rake mean?

答案 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来解决这个问题。