簡體   English   中英

切換Ruby版本以在服務器上運行命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM