适用于 Google App Engine Ruby 标准环境 w/Rails 的正确 Ruby 版本
proper Ruby version for Google App Engine Ruby Standard Environment w/Rails
使用Google为Google App Engine Ruby 2.5标准环境提供的默认app.yaml配置,使用Rails无法成功部署。如果我在本地使用 Ruby 2.5.5,在我的 .ruby-version
和 Gemfile
中,部署失败:
Your Ruby version is 2.5.7, but your Gemfile specified 2.5.5.
如果我在本地和我的 Gemfile
和 .ruby-version
文件中使用 Ruby 2.5.7,则部署成功,但访问该应用程序会导致日志中出现以下错误:
bundler: failed to load command: rails (/srv/vendor/bundle/ruby/2.5.0/bin/rails)
Bundler::RubyVersionMismatch: Your Ruby version is 2.5.5, but your Gemfile specified 2.5.7
请注意,我已正确设置 .gcloudignore
以包含 .ruby-version
和应用引擎默认忽略的其他重要点文件。
好尴尬!
您可以使用此存储库重现我的构建:https://github.com/sam0x17/ruby_standard_environment_version_issue
根据 Daniel Azuma 的评论,将我的 Gemfile
中 ruby
的版本限制更改为 ruby "~> 2.5.5"
似乎可以解决问题。我的理解是将来不再需要这样做,但目前这是解决方法。
这是来自 Ruby App Engine 运行time 团队的官方说法。
如果你的 Gemfile 中有 Ruby 版本约束,总是 使用悲观版本约束(或其他机制来允许更新的补丁级别),而不是锁定到特定的补丁级别。 例如,使用 ruby "~> 2.5.5"
之类的内容来指示 2.5.5 或任何更新的补丁级别,而不是 ruby "2.5.5"
或 ruby "2.5.7"
。这不是临时解决方法,而是 App Engine 标准的实际要求和最佳实践。
原因有两个。在推出新的 Ruby 版本期间,可能会在短时间内出现 bundle install
运行 与应用程序本身不同的 Ruby 补丁级别。这就是您 运行 进入的内容,这显然是预期的行为,因为 "bundle builder" 组件是独立于 运行time 图像推出的。
但更重要的是,App Engine 标准可能会随时升级您的 Ruby 补丁级别。您的应用可能 运行ning Ruby 今天是 2.5.6,但明天您可能会发现它已升级到 Ruby 2.5.7,即使您没有明确重新部署。这是 App Engine 的预期行为:它 运行 明显地应用关键更新和安全补丁,并且可能包括更新 Ruby 解释器的补丁级别。 (请注意,App Engine 仅更新 Ruby 补丁级别。除非您明确告诉它使用 Ruby 2.6 运行time。)由于这个特性,如果你的 Gemfile 指定了 Ruby 版本,它需要能够处理补丁级别更新,例如通过使用悲观版本约束。
作为辅助说明,.ruby-version
在 App Engine 标准环境中被 忽略 。请注意,这与 App Engine 柔性环境不同,后者使用该文件作为您的应用请求特定 Ruby 版本到 运行 的方式。但是,标准环境会为您选择和控制 Ruby 版本,您没有发言权。
对困境深表歉意。我将与团队一起努力澄清我们的文档。
使用Google为Google App Engine Ruby 2.5标准环境提供的默认app.yaml配置,使用Rails无法成功部署。如果我在本地使用 Ruby 2.5.5,在我的 .ruby-version
和 Gemfile
中,部署失败:
Your Ruby version is 2.5.7, but your Gemfile specified 2.5.5.
如果我在本地和我的 Gemfile
和 .ruby-version
文件中使用 Ruby 2.5.7,则部署成功,但访问该应用程序会导致日志中出现以下错误:
bundler: failed to load command: rails (/srv/vendor/bundle/ruby/2.5.0/bin/rails)
Bundler::RubyVersionMismatch: Your Ruby version is 2.5.5, but your Gemfile specified 2.5.7
请注意,我已正确设置 .gcloudignore
以包含 .ruby-version
和应用引擎默认忽略的其他重要点文件。
好尴尬!
您可以使用此存储库重现我的构建:https://github.com/sam0x17/ruby_standard_environment_version_issue
根据 Daniel Azuma 的评论,将我的 Gemfile
中 ruby
的版本限制更改为 ruby "~> 2.5.5"
似乎可以解决问题。我的理解是将来不再需要这样做,但目前这是解决方法。
这是来自 Ruby App Engine 运行time 团队的官方说法。
如果你的 Gemfile 中有 Ruby 版本约束,总是 使用悲观版本约束(或其他机制来允许更新的补丁级别),而不是锁定到特定的补丁级别。 例如,使用 ruby "~> 2.5.5"
之类的内容来指示 2.5.5 或任何更新的补丁级别,而不是 ruby "2.5.5"
或 ruby "2.5.7"
。这不是临时解决方法,而是 App Engine 标准的实际要求和最佳实践。
原因有两个。在推出新的 Ruby 版本期间,可能会在短时间内出现 bundle install
运行 与应用程序本身不同的 Ruby 补丁级别。这就是您 运行 进入的内容,这显然是预期的行为,因为 "bundle builder" 组件是独立于 运行time 图像推出的。
但更重要的是,App Engine 标准可能会随时升级您的 Ruby 补丁级别。您的应用可能 运行ning Ruby 今天是 2.5.6,但明天您可能会发现它已升级到 Ruby 2.5.7,即使您没有明确重新部署。这是 App Engine 的预期行为:它 运行 明显地应用关键更新和安全补丁,并且可能包括更新 Ruby 解释器的补丁级别。 (请注意,App Engine 仅更新 Ruby 补丁级别。除非您明确告诉它使用 Ruby 2.6 运行time。)由于这个特性,如果你的 Gemfile 指定了 Ruby 版本,它需要能够处理补丁级别更新,例如通过使用悲观版本约束。
作为辅助说明,.ruby-version
在 App Engine 标准环境中被 忽略 。请注意,这与 App Engine 柔性环境不同,后者使用该文件作为您的应用请求特定 Ruby 版本到 运行 的方式。但是,标准环境会为您选择和控制 Ruby 版本,您没有发言权。
对困境深表歉意。我将与团队一起努力澄清我们的文档。