在部署使用 Bundler 的應用程式之前,將您的 Gemfile
和 Gemfile.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
,則會自動使用快取的寶石。
若要提取 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
來執行套件中寶石的任何可執行檔
$ 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
旗標會新增下列預設值
vendor/bundle
,而不是安裝到系統位置。當您在應用程式內呼叫 bundler(使用 Bundler.setup
和 Bundler.require
)時,bundler 會透明地記住這個位置。bundle pack
,已檢查 vendor/cache
目錄,且沒有任何 git gem,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
,並啟動您的應用程式(或執行您的測試),則它將永遠是最新的。