由于捆绑版本,我无法在 Cloud Foundry 上部署工作 rails 6 应用程序

I can't deploy a working rails 6 app on cloud foundry due to bundle version

即使我的 gemfile 中有更高版本的捆绑器,我也遇到了这个问题。可能是什么问题导致的?

APP/PROC/WEB    0   from /home/vcap/app/bin/bundle:3:in `<main>'    
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   from /usr/lib/ruby/2.5.0/rubygems.rb:263:in `bin_path'  
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   To install the missing version, run `gem install bundler:2.1.4` 
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   To update to the lastest version installed on your system, run `bundle update --bundler`.   
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   /usr/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': Could not find 'bundler' (2.1.4) required by your /home/vcap/app/Gemfile.lock. (Gem::GemNotFoundException)  
Feb 18, 2021, 08:40:32 PM
APP/PROC/WEB    0   /usr/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': Could not find 'bundler' (2.1.4) required by your /home/vcap/app/Gemfile.lock. (Gem::GemNotFoundException)  
Feb 18, 2021, 08:57:02 PM
APP/PROC/WEB    0   To update to the lastest version installed on your system, run `bundle update --bundler`.

Ruby buildpack 不能携带每个版本的 Ruby & bundler,它会成为一个非常大的 buildpack。因此,所有 buildpack 将仅保留 select 个软件版本集,它们包含在每个版本的 buildpack 中。 Buildpacks 旨在鼓励您跟上软件的最新版本,因此随着 buildpacks 的更新和新版本的削减,buildpacks 将删除旧版本的软件。

这意味着您有三个选择:

  1. 您可以查看您的 buildpack 的发行说明或 build pack dependency viewer 查看包含您需要的特定软件版本的 buildpack 版本。

    例如,如果您必须有 bundler 2.1.4,那么您需要查看 find the latest buildpack version which contains it. Hint, it's v1.8.27. You can confirm the same info using the buildpack release notes also

    找到特定的 buildpack 版本后,您需要告诉 Cloud Foundry 您需要该版本的 buildpack,其中包含您需要的软件版本。例如:cf push -b https://github.com/cloudfoundry/ruby-buildpack#v1.8.27.

    虽然这有一些缺点,a.) Cloud Foundry 必须能够与 Internet 通信并下载该 buildpack 和 b.) 您受限于该 buildpack 中的软件版本,因此您的应用程序可能容易受到 buildpack 安装的较新版本软件中已解决的安全问题的影响。

  2. 大多数时候你并不关心 Ruby、Bundler 或其他库的确切具体版本,你想要的是 declare a more flexible version in your project,比如“我想要 Bundler 2”。届时,只要您使用的 buildpack 仍然包含某些版本的 Bundler 2(即使是主要版本也会随着时间的推移而退出),您将获得最新的 Bundler 2.x.y 版本支持。

  3. 如果您觉得确实需要继续指定 Bundler(或其他软件)的确切版本,则需要定期更新您的应用程序及其用于与buildpack 安装的更新版本。

    例如,在我撰写本文时,最新的 Ruby buildpack 1.8.32 包含 Bundler 2.2.11。这意味着您需要更新您的应用才能期待并使用此版本。

一般来说,最无摩擦和安全的选择是#2。您将继续获得软件更新,并且它应该可以继续部署而不会出现问题。缺点是随着时间的推移,您可能会获得与您的应用程序不兼容的更新。然后,您必须先修复该问题,然后才能继续部署您的应用程序。

选项 #3 也可以,但它需要大量的微观管理。如果您真的不需要那种级别的控制,我建议您使用选项 #2。您将获得类似的结果,而且工作量会更少。

选项 #1 应该是最后的手段,只有在您的应用绝对没有其他选择时才使用,或者您可能需要花一些时间升级应用以与新版本兼容。 随着时间的推移,此版本会使您的应用程序容易受到安全漏洞的影响。

您可能会认为这听起来像是一种巨大的痛苦,但事实并非如此。它是 buildpack 迫使您考虑您的软件依赖关系并强制进行良好的升级卫生。这是一件非常好的事情,因为它将使您的软件保持最新状态,并保护您的应用程序免受其使用的软件中的漏洞的影响。