gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 09:01:29 24 4
gpt4 key购买 nike

我有一个包含以下内容的 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 命令上崩溃:

Your Ruby version is 1.9.3, but your Gemfile specified 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

最佳答案

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

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

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

这通常是您想要发生的,因此您总是使用在您的 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 干扰的情况下运行.

关于ruby - UNIX `system` 命令使用不同版本的 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34515005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com