【发布时间】:2015-09-03 12:56:33
【问题描述】:
我了解了 rvm 和 bundler 之间的区别。在我的本地机器上,我使用 rvm 来管理不同的 rubies 和这些 rubies 的不同 gemset。例如,我有一个 ruby 2.1.2 和一个名为 core 的 gemset:
$ 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 和一个用于该 ruby 的 gemset 核心。当我运行我的项目时,rails 会查找位于 /Users/donato/.rvm/gems/ruby-2.1.2@core/gems 中的 gem。它不会在shared/bundle 处寻找宝石。事实上,我什至在本地机器的 Rails 根目录下都没有共享目录。
所以在我的本地机器上,虽然 bundler 管理 gem 依赖项并在 Gemfile 中找到新的 gem 时添加 gem,但它不管理 gem 安装的位置。它将 gem 安装在 rvm gemdir 中。事实上,当你运行bundle install 并且Gemfile 中存在一个新的gem 时,bundler 实际上将gem 安装在rvm 的gem 目录中。
令人困惑的是,这不是它在登台或生产部署中的工作方式。 bundler 似乎在位置 shared/bundle 中寻找宝石。因此,显然在生产环境中,bundler 不仅想要安装 gem,还想要管理 gem 的位置,让 rvm 只关心 rubies,而不是 gem 位置。
这给我带来了问题。我正在使用 capistrano 进行部署。当我运行cap staging deploy 时,它正在wrong ruby 中安装gem。
capistrano 脚本运行这一行:
运行 /usr/local/rvm/bin/rvm ruby-2.1.2@core 做捆绑安装 --path /var/www/mysite_staging/shared/bundle --无需开发测试 --deployment --quiet
您可以看到它在 shared/bundle 中安装了 gem。
部署成功后转到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 版本的 gem?
【问题讨论】:
-
我在更新 bundler 后遇到了类似的事情。旧版本的捆绑器按预期工作
标签: ruby-on-rails ruby rvm capistrano bundler