2013-04-24 34 views
0

我有一个我用capistrano部署的Ruby应用程序(非Rails)。我可以ssh到我的服务器,cd/current目录并用命令来启动它切换红宝石版本以在服务器上运行命令

ruby tweet_tracker.rb start 

但是,如果我的CD了水平和运行

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的gem。

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

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

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

+1

你可以创建一个脚本来cd到正确的文件夹并启动应用程序? – 2013-04-24 19:13:50

回答

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 file:

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

RVM通常很痛苦,当它合作mes到编写调用Ruby应用程序的脚本。存在许多用户已经迁移到的更好的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生成初始化脚本。例如,与Upstart configuration集成在一起会有些棘手。