在部署使用 Bundler 的应用程序之前,将您的 Gemfile
和 Gemfile.lock
添加到源代码管理中,但忽略 .bundle
文件夹,该文件夹特定于每台机器。
$ echo ".bundle" >> .gitignore
$ git add Gemfile Gemfile.lock .gitignore
$ git commit -m "Add Bundler support"
完成此操作后,有两种方法可以使用 Bundler 部署:手动或自动。
在您的部署脚本中,在更新到最新代码后,将您的 bundle 安装到 vendor/bundle
目录中,确保满足所有依赖项。
$ bundle install --deployment
像往常一样启动您的应用程序服务器,您的应用程序将使用您的捆绑环境,其中包含与您在开发中使用的完全相同的 gem。
如果您已运行 bundle package
,则将自动使用缓存的 gem。
要引入 Bundler Cap 任务,只需将此添加到您的 deploy.rb
文件中
require 'bundler/capistrano'
就是这样!运行 cap deploy
现在将在远程服务器上自动运行 bundle install
,并使用部署友好的选项。可以在 cap 任务的帮助中找到可以更改的选项列表。要查看它,请运行 cap -e bundle:install
。
有一个默认的 Vlad 任务可用。要使其可用,请将此行添加到 Vlad deploy.rb
中。
require 'bundler/vlad'
完成此操作后,vlad:bundle:install
任务将可用。确保它作为您部署的一部分运行。例如
task "vlad:deploy" => %w[
vlad:update vlad:bundle:install vlad:start_app vlad:cleanup
]
确保使用 bundle exec
运行捆绑包中 gem 的任何可执行文件
$ bundle exec rake db:setup
或者,您可以在安装命令上使用 --binstubs
选项来生成可执行二进制文件,这些二进制文件可用于代替 bundle exec
。
当您部署到 Heroku 时,只要存在 Gemfile,Bundler 就会自动运行。如果您签入您的 Gemfile.lock,Heroku 将运行 bundle install --deployment
。如果您想使用 --without
选项排除某些组,则需要使用 heroku config
。
$ heroku config:set BUNDLE_WITHOUT="test development" --app app_name
当您运行 bundle install
时,bundler 将(默认情况下)将您的 gem 安装到您的系统 gem 存储库中。这意味着它们将显示在 gem list
中。此外,如果您正在开发多个应用程序,则无需为每个应用程序下载和安装通用的 gem。这对于开发来说很好,但对于部署来说有点问题。
在部署场景中,你用来部署的 Unix 用户可能没有权限将 gem 安装到系统位置。即使该用户有权限(或者你使用 `sudo`),启动应用程序的用户可能也无法访问它们。例如,Passenger 使用 `nobody` 用户运行其 Ruby 子进程,这是一个权限受限的用户。在部署环境中,隔离的优势更大(即使以部署时 `bundle install` 速度略慢为代价,尤其是在一些第三方依赖项发生变化时)。
因此,Bundler 带有一个 `--deployment` 标志,它封装了在部署环境中使用 Bundler 的最佳实践。这些实践基于我们在 Bundler 开发过程中收到的大量反馈,以及许多反映了对如何为部署最佳配置 Bundler 的误解的错误报告。`--deployment` 标志添加了以下默认值:
如果你使用 Capistrano,你应该将 `vendor/bundle` 符号链接到 `shared/vendor_bundle`,这样 Bundler 就可以在部署之间共享你的已安装 gem(如果你没有进行任何更改,这会使事情变得更快),但仍然可以让你从其他应用程序中隔离。
通过将 bundle 目录默认设置为 `vendor/bundle`,并将你的 bundle 作为部署过程的一部分进行安装,你可以确保检查出你的应用程序的同一个 Unix 用户也安装了你的应用程序所需的第三方代码。这意味着如果 Passenger(或 Unicorn)可以访问你的应用程序,它也可以访问其依赖项。
--deployment
标志需要一个最新的 Gemfile.lock
文件,以确保您在开发和测试环境中进行的测试能够真实反映您部署到生产环境的代码。您可以在部署应用程序之前运行 bundle check
命令来确保 Gemfile.lock
文件是最新的。请注意,如果您在上次修改 Gemfile
文件后运行过 bundle install
命令,成功启动了应用程序(或运行了测试),那么 Gemfile.lock
文件始终是最新的。