首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用不同版本的Ruby的UNIX ` `system`‘命令

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

Stack Overflow用户
提问于 2015-12-29 16:24:35
回答 3查看 200关注 0票数 2

我有一个包含以下内容的Rakefile:

代码语言:javascript
复制
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的输出

代码语言:javascript
复制
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的内容:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-19 18:17:00

Ruby在启动时将检查一些环境变量,您可以使用这些变量来控制加载路径和设置选项。

Bundler具有“传染性”,因为当您使用它时,它会添加一些环境变量,以便另一个作为子进程执行的Ruby将自动尝试使用相同的Gemfile

ruby -e "puts ENV.inspect"的输出与使用Bundler的项目中的bundle exec ruby -e "puts ENV.inspect"进行比较。

这通常是您希望发生的事情,因此您总是使用在Gemfile中定义的Gems和Ruby版本。

heroku命令包括它自己安装的Ruby (在我的机器上是/usr/local/heroku/ruby ),它使用的是它而不是您的正常版本。这是Ruby的一个很旧的版本,我的版本是1.9.3p194。

因此,当您使用system运行heroku命令时,创建的Ruby检查环境变量并加载绑定程序(使用您使用的Ruby版本的Gem ),然后尝试根据您的Gemfile设置所有内容。这就是Ruby版本不匹配的地方。

要解决这个问题,您需要告诉Bundler在启动子进程时不要包含各种环境变量。有几种处理此问题的方法,在您的示例中,您希望使用Bundler.clean_system而不是普通的system

代码语言:javascript
复制
Bundler.clean_system "heroku pg:psql DATABASE -c 'DELETE FROM <table name>' -a <heroku app name>"

这将允许Heroku客户端在不受邦德勒和Gemfile干扰的情况下运行。

票数 2
EN

Stack Overflow用户

发布于 2015-12-29 16:39:15

尝试:

代码语言:javascript
复制
bundle exec rake <command>

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

更多信息可在此查阅:

What does bundle exec rake mean?

票数 0
EN

Stack Overflow用户

发布于 2015-12-29 17:50:54

看看这里,How to fix "Your Ruby version is 1.9.3, but your Gemfile specified 2.0.0"

试试ruby -v

我通过运行rvm install 2.2.2解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34515005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档