适用于Google App Engine Ruby标准环境的正确Ruby版本(带有Rails)

使用Google为Google App Engine Ruby 2.5标准环境提供的默认app.yaml配置,使用Rails时我无法成功部署。如果我在本地使用Ruby 2.5.5,并且在我的.ruby-versionGemfile中使用Ruby,则部署失败,并显示以下信息:

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

w406834009 回答:适用于Google App Engine Ruby标准环境的正确Ruby版本(带有Rails)

这是Ruby App Engine运行时团队的正式用语。

如果您的Gemfile中有Ruby版本约束,则始终始终使用悲观版本约束(或其他允许更新补丁程序级别的机制),而不是锁定到特定补丁程序级别。 / strong>例如,使用ruby "~> 2.5.5"之类的内容来表示2.5.5或任何更新的补丁程序级别,而不要使用ruby "2.5.5"ruby "2.5.7"。这不是暂时的解决方法,而是App Engine标准的实际要求和最佳做法。

原因是双重的。在推出新的Ruby版本期间,可能会在短时间内bundle install在与应用程序本身不同的Ruby补丁程序级别上运行。这是您遇到的事情,并且显然是预期的行为,因为“捆绑生成器”组件是独立于运行时映像推出的。

但更重要的是, App Engine标准可以随时升级Ruby补丁程序级别。您的应用今天可能在Ruby 2.5.6上运行,但是明天您可能会发现它已升级到Ruby 2.5.7。 ,即使您没有明确地重新部署。这是App Engine的预期行为:它透明地应用关键更新和安全补丁,并且可能包括更新Ruby解释器的补丁级别。 (请注意,App Engine仅更新Ruby补丁程序级别。除非您明确告知其使用Ruby 2.6运行时,否则它永远不会将您的应用程序从Ruby 2.5更新为Ruby 2.6。)由于此功能,如果您的Gemfile指定了Ruby,版本,它需要能够处理补丁程序级别的更新,例如通过使用悲观的版本约束。

作为次要说明,.ruby-version在App Engine标准环境中被忽略。请注意,这是与App Engine灵活环境不同的 ,该环境使用该文件作为您的应用请求运行特定Ruby版本的方式。但是,标准环境会为您选择和控制Ruby版本,您没有发言权。

对困境的道歉。我将与团队合作,尝试澄清我们的文档。

,

根据丹尼尔·阿祖玛(Daniel Azuma)的评论,好像将我的rubyGemfile的版本约束更改为ruby "~> 2.5.5"可以解决此问题。我的理解是,将来将不再需要此操作,但是现在这是解决方法。

本文链接:https://www.f2er.com/3109293.html

大家都在问