我有一个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版本,因为系统上还运行其他应用程序。
答案 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集成起来有点棘手。