[英]Switching ruby version to run a command on server
我有一個用capistrano部署的Ruby應用程序(非Rails)。 我可以ssh進入服務器, cd
進入/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安裝gem。
問題是,當我嘗試從應用程序目錄外部啟動應用程序時,它使用默認的Ruby(由RVM設置為193的較低版本)。
在運行時,如何確保應用程序使用其.ruby-version
指定的Ruby版本?
我寧願不更改RVM的默認Ruby版本,因為系統上正在運行其他應用程序。
這是一個示例項目:
myproject/
├── .ruby-version
└── subproject/
├── .ruby-version
└── script.rb
myproject / .ruby_version:
system
myproject / subproject / .ruby_version:
ruby-1.9.3-p392
myproject / subproject / 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
當編寫調用Ruby應用程序的腳本時,RVM通常很痛苦。 存在許多用戶已經遷移到的更好的Ruby版本包裝器 。 RVM的主要問題之一是它非常適合交互式shell ,但不適用於腳本。
主要問題是RVM設置了after_cd
鈎子 ,這是您只能在交互式shell中獲得的東西。 結果,要求用戶運行類似於以下命令的序列:
cd $APPDIR
source /home/$APPUSER/.rvm/scripts/rvm
rvm rvmrc trust && rvm rvmrc load
bundle exec ./bin/server start
您可以使用rvm wrapper
生成一個初始化腳本。 但是,例如,與Upstart配置集成起來比較棘手。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.