我有rvm和bundler之间区别的要点。在我的本地机器上,我使用rvm来管理不同的红宝石和不同的宝石。例如,我有一个带有名为core的gemset的ruby 2.1.2:
$ rvm-prompt
ruby-2.1.2@core
$ rvm gemdir
/Users/donato/.rvm/gems/ruby-2.1.2@core
$ cd /Users/donato/.rvm/gems/ruby-2.1.2@core/gems
$ ls
actionmailer-4.1.10
...
正如你所看到的,我有一个ruby 2.1.2和一个gemset核心用于那个ruby。当我运行我的项目时,rails会查找/Users/donato/.rvm/gems/ruby-2.1.2@core/gems
中的宝石。它不会在shared/bundle
寻找宝石。实际上,我的本地计算机上的Rails根目录中甚至没有共享目录。
所以在我的本地机器上,虽然bundler管理gem依赖项并添加gems如果在Gemfile中找到新的gems,它不会管理gems安装的LOCATION。它在rvm gemdir
中安装宝石。实际上,当您运行bundle install
并且Gemfile中存在新的gem时,Bundler实际上会在rvm的gem目录中安装gem。
令人困惑的是,这不是在暂存或生产部署中的工作方式。看来捆绑包在shared/bundle
位置查找宝石。显然在生产中,捆绑商不仅想要安装宝石,而且还希望管理宝石的位置,让rvm只担心红宝石,而不是宝石位置。
这给我带来了一个问题。我正在使用capistrano进行部署。当我运行cap staging deploy
时,它正在错误的红宝石中安装宝石。
capistrano脚本运行这一行:
运行/ usr / local / rvm / bin / rvm ruby-2.1.2@core进行捆绑安装 --path / var / www / mysite_staging / shared / bundle - without development test --deployment --quiet
你可以看到它在shared / bundle中安装了宝石。
成功部署后,当我转到shared/bundle/ruby
时,会看到以下目录:
/shared/bundle/ruby/2.1.0
等一下!在我使用capistrano-rvm的capistrano 3脚本中,我指定了以下内容:
set :rvm_type, :system
set :rvm_ruby_version, 'ruby-2.1.2@core'
如果建议使用bundler来管理登台和生产中的gem位置,在shared / bundle目录下,那我该如何解决这个问题呢?为什么bundler会为这个项目安装错误的ruby版本的宝石?
答案 0 :(得分:0)
那么,您所说的机器与您部署的服务器之间的主要区别是什么?
看看:http://bundler.io/v1.9/deploying.html 查看开发和部署之间的不同行为,并阅读有关capistrano的说明。
希望这会有所帮助