Docs header transparent bg

如何部署捆绑的应用程序

在部署使用 Bundler 的应用程序之前,将您的 GemfileGemfile.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。

了解更多:打包

使用 Capistrano 自动部署

要引入 Bundler Cap 任务,只需将此添加到您的 deploy.rb 文件中

require 'bundler/capistrano'

就是这样!运行 cap deploy 现在将在远程服务器上自动运行 bundle install,并使用部署友好的选项。可以在 cap 任务的帮助中找到可以更改的选项列表。要查看它,请运行 cap -e bundle:install

使用 Vlad 自动部署

有一个默认的 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

当您部署到 Heroku 时,只要存在 Gemfile,Bundler 就会自动运行。如果您签入您的 Gemfile.lock,Heroku 将运行 bundle install --deployment。如果您想使用 --without 选项排除某些组,则需要使用 heroku config

$ heroku config:set BUNDLE_WITHOUT="test development" --app app_name

Heroku Bundler 文档

部署您的应用程序

当您运行 bundle install 时,bundler 将(默认情况下)将您的 gem 安装到您的系统 gem 存储库中。这意味着它们将显示在 gem list 中。此外,如果您正在开发多个应用程序,则无需为每个应用程序下载和安装通用的 gem。这对于开发来说很好,但对于部署来说有点问题。

在部署场景中,你用来部署的 Unix 用户可能没有权限将 gem 安装到系统位置。即使该用户有权限(或者你使用 `sudo`),启动应用程序的用户可能也无法访问它们。例如,Passenger 使用 `nobody` 用户运行其 Ruby 子进程,这是一个权限受限的用户。在部署环境中,隔离的优势更大(即使以部署时 `bundle install` 速度略慢为代价,尤其是在一些第三方依赖项发生变化时)。

因此,Bundler 带有一个 `--deployment` 标志,它封装了在部署环境中使用 Bundler 的最佳实践。这些实践基于我们在 Bundler 开发过程中收到的大量反馈,以及许多反映了对如何为部署最佳配置 Bundler 的误解的错误报告。`--deployment` 标志添加了以下默认值:

  • Bundler 不会将 gem 安装到系统位置,而是将它们安装到应用程序内的 `vendor/bundle` 目录。当你从应用程序内部调用 Bundler 时(使用 `Bundler.setup` 和 `Bundler.require`),Bundler 会透明地记住这个位置。
  • Bundler 不会使用已经安装到系统中的 gem,即使它们存在。
  • 如果你已经运行了 `bundle pack`,签入了 `vendor/cache` 目录,并且没有 git gem,Bundler 在安装你的 bundle 时不会连接互联网。
  • Bundler 需要一个 `Gemfile.lock` 快照,如果没有提供,它会失败。
  • Bundler 不会透明地更新你的 `Gemfile.lock`,即使它与你的 `Gemfile` 不一致。

如果你使用 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 文件始终是最新的。

在 GitHub 上编辑此文档,如果您发现错误或遗漏。