切换ruby版本以在服务器上运行命令

时间:2013-04-24 19:07:58

标签: ruby rvm capistrano rvm-capistrano

我有一个Ruby应用程序(非Rails),我使用capistrano部署。我可以将我的服务器cd ssh到/current目录中并使用命令启动它

ruby tweet_tracker.rb start

但是,如果我上一级并运行

ruby current/tweet_tracker.rb start

我收到错误:

/home/deploy/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- tweetstream (LoadError)
    from /home/deploy/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/deploy/dev/tweet_tracker/current/tweet_tracker.rb:4:in `<main>'

现在这显然是因为我在每个目录中使用不同的ruby版本运行命令。

我在应用程序中有一个.ruby-version文件,指定ruby-1.9.3-p392。我的capistrano部署脚本指定set :rvm_ruby_string, '1.9.3-p392',当它作为部署过程的一部分运行bundle install时,它会安装193-p392的宝石。

问题是,当我尝试从应用程序目录外部启动应用程序时,它使用默认的Ruby(由RVM设置为193的较小版本)。

如何确保应用程序在运行时使用.ruby-version指定的Ruby版本?

我不想更改RVM的默认Ruby版本,因为系统上还运行其他应用程序。

2 个答案:

答案 0 :(得分:0)

这是一个示例项目:

myproject/
├── .ruby-version
└── subproject/
    ├── .ruby-version
    └── script.rb

的myproject / .ruby_version:

system

的myproject /子项目/ .ruby_version:

ruby-1.9.3-p392

的myproject /子项目/ script.rb:

puts RUBY_VERSION

现在我想你的问题可以像这样模仿:

$ cd myproject
$ ruby subproject/script.rb
1.8.7
$ cd subproject
$ ruby script.rb
1.9.3

解决此问题的一种方法是使用记录不良的命令rvm exec

$ cd myproject
$ rvm 1.9.3-p392 exec ruby subproject/script.rb
1.9.3

您可以扩展为自动阅读.ruby-version文件:

$ rvm `cat subproject/.ruby-version` exec ruby subproject/script.rb
1.9.3

答案 1 :(得分:0)

在编写调用Ruby应用程序的脚本时,RVM通常非常痛苦。许多用户迁移到了更好的Ruby version wrapper。 RVM的一个主要问题是它非常适合interactive shells,但对于脚本而言则不是很多。

主要问题是RVM设置了after_cd hook,这只是你在交互式shell中得到的东西;因此,用户需要运行与此类似的命令序列:

cd $APPDIR
source /home/$APPUSER/.rvm/scripts/rvm
rvm rvmrc trust && rvm rvmrc load
bundle exec ./bin/server start

您可以使用rvm wrapper生成init脚本。但是,例如,与Upstart configuration集成起来有点棘手。