2013-04-24 60 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集成在一起會有些棘手。