Docs header transparent bg

如何部署已打包的應用程式

在部署使用 Bundler 的應用程式之前,將您的 GemfileGemfile.lock 加入原始碼控制,但忽略 .bundle 資料夾,因為它是特定於每部電腦的。

$ echo ".bundle" >> .gitignore
$ git add Gemfile Gemfile.lock .gitignore
$ git commit -m "Add Bundler support"

完成上述步驟後,有兩種方法可以使用 Bundler 進行部署:手動或自動。

手動部署

在您的部署指令碼中,在更新到最新程式碼後,將您的套件安裝到 vendor/bundle 目錄,確保滿足您的所有相依性。

$ bundle install --deployment

像往常一樣啟動您的應用程式伺服器,您的應用程式將使用您在開發中使用的完全相同的寶石,來使用您的已打包環境。

如果您已執行 bundle package,則會自動使用快取的寶石。

了解更多:封裝

使用 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 來執行套件中寶石的任何可執行檔

$ 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.setupBundler.require)時,bundler 會透明地記住這個位置。
  • bundler 即使已存在,也不會使用已安裝到您系統的 gem。
  • 如果您已執行 bundle pack,已檢查 vendor/cache 目錄,且沒有任何 git gem,bundler 在安裝您的套件時不會連線到網路。
  • bundler 會需要一個 Gemfile.lock 快照,如果您沒有提供,則會失敗。
  • 如果您的 Gemfile.lock 與您的 Gemfile 不符,bundler 就不會透明地更新您的 Gemfile.lock

如果您使用 Capistrano,您應該將 vendor/bundle 符號連結到 shared/vendor_bundle,這樣 bundler 才能在部署之間共用您已安裝的 gem(如果您沒有進行任何變更,這會讓事情變得快速),但仍然能讓您享有與其他應用程式隔離的好處。

透過將套件目錄預設為 vendor/bundle,並將您的套件安裝為部署程序的一部分,您可以確定檢出您應用程式的 Unix 使用者也安裝了您的應用程式所需的第三方程式碼。這表示如果 Passenger(或 Unicorn)可以看到您的應用程式,它也可以看到其相依項。

--deployment 旗標需要最新的 Gemfile.lock,以確保您已完成的測試(在開發和登台環境中)實際上反映您放入生產環境的程式碼。您可以在部署應用程式之前執行 bundle check,以確保您的 Gemfile.lock 是最新的。請注意,如果您自上次變更 Gemfile 以來已成功執行 bundle install,並啟動您的應用程式(或執行您的測試),則它將永遠是最新的。

在 GitHub 上編輯此文件,如果您發現錯誤或發現遺漏某些內容。