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-version在运行时使用它指定的 Ruby 版本?

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

4

2 回答 2

0

这是一个示例项目:

myproject/
├── .ruby-version
└── subproject/
    ├── .ruby-version
    └── script.rb

我的项目/.ruby_version:

system

我的项目/子项目/.ruby_version:

ruby-1.9.3-p392

我的项目/子项目/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
于 2013-04-24T19:48:49.963 回答
0

在编写调用 Ruby 应用程序的脚本时,RVM 通常会非常痛苦。存在许多用户迁移到的更好的Ruby 版本包装器。RVM 的主要问题之一是它非常适合交互式 shell,但不适用于脚本。

主要问题是 RVM 设置了一个after_cdhook,这是你只能在交互式 shell 中获得的东西;因此,用户需要运行一系列与此类似的命令:

cd $APPDIR
source /home/$APPUSER/.rvm/scripts/rvm
rvm rvmrc trust && rvm rvmrc load
bundle exec ./bin/server start

您可以使用它rvm wrapper来生成一个初始化脚本。虽然,例如,与Upstart 配置集成有点棘手。

于 2013-04-24T19:54:50.907 回答