Ruby on rails 适用于谷歌应用程序引擎Ruby标准环境(带Rails)的正确Ruby版本

Ruby on rails 适用于谷歌应用程序引擎Ruby标准环境(带Rails)的正确Ruby版本,ruby-on-rails,ruby,google-app-engine,google-cloud-platform,ruby-2.5,Ruby On Rails,Ruby,Google App Engine,Google Cloud Platform,Ruby 2.5,使用Google为Google app Engine Ruby 2.5标准环境提供的默认app.yaml配置,在使用Rails时无法成功部署。如果我在本地使用Ruby 2.5.5,并且在我的.Ruby版本和Gemfile中使用,则部署会失败,原因是: Your Ruby version is 2.5.7, but your Gemfile specified 2.5.5. 如果我在本地以及Gemfile和.Ruby version文件中使用Ruby 2.5.7,则部署成功,但访问应用程序会导致

使用Google为Google app Engine Ruby 2.5标准环境提供的默认app.yaml配置,在使用Rails时无法成功部署。如果我在本地使用Ruby 2.5.5,并且在我的
.Ruby版本
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
和其他默认情况下被appengine忽略的重要点文件

真是窘境


您可以使用此repo复制我的构建:

根据Daniel Azuma的评论,似乎将我的
Gemfile
中的
ruby
的版本约束更改为
ruby“~>2.5.5”
解决了这个问题。我的理解是,在将来这将不再是必要的,但现在这是解决办法。

根据Daniel Azuma的评论,似乎将我的
Gemfile
中的
ruby
的版本约束更改为
ruby”~>2.5.5“
解决了这个问题。我的理解是,在未来这将不再是必要的,但现在这是解决办法。

以下是Ruby应用程序引擎运行时团队的官方说法

如果您的GEM文件中有Ruby版本约束,请始终使用悲观版本约束(或其他机制以允许更高的修补级别),而不是锁定到特定的修补级别。例如,使用类似
Ruby“~>2.5.5”
的内容来指示2.5.5或任何更新的修补级别,而不是
Ruby“2.5.5”
ruby“2.5.7”
。这不是临时解决办法,而是应用程序引擎标准的实际要求和最佳实践

原因有两方面。在新Ruby版本的推出期间,可能会有一段短时间,
捆绑包安装
在与应用程序本身不同的Ruby补丁级别上运行。这就是您遇到的情况,显然这是预期的行为,因为“捆绑包生成器”“组件独立于运行时映像展开

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

另一个注意事项是,
.ruby版本
在App Engine标准环境中被忽略。注意这与AppEngineFlexibleEnvironment不同,AppEngineFlexibleEnvironment使用文件作为应用程序请求特定Ruby版本运行的方式。然而,标准环境为您选择并控制Ruby版本,您没有发言权


为困境道歉。我将与团队一起努力澄清我们在这方面的文档。

以下是Ruby应用程序引擎运行时团队的官方说法

如果您的GEM文件中有Ruby版本约束,请始终使用悲观版本约束(或其他机制以允许更高的修补级别),而不是锁定到特定的修补级别。例如,使用类似
Ruby“~>2.5.5”
的内容来指示2.5.5或任何更新的修补级别,而不是
Ruby“2.5.5”
ruby“2.5.7”
。这不是临时解决办法,而是应用程序引擎标准的实际要求和最佳实践

原因有两方面。在新Ruby版本的推出期间,可能会有一段短时间,
捆绑包安装
在与应用程序本身不同的Ruby补丁级别上运行。这就是您遇到的情况,显然这是预期的行为,因为“捆绑包生成器”“组件独立于运行时映像展开

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

另一个注意事项是,
.ruby版本
在App Engine标准环境中被忽略。注意这与AppEngineFlexibleEnvironment不同,AppEngineFlexibleEnvironment使用文件作为应用程序请求特定Ruby版本运行的方式。然而,标准环境为您选择并控制Ruby版本,您没有发言权

为困境道歉。我将与团队一起努力澄清我们在这方面的文档。

根据GCP文档中的详细说明,我成功地在GAE标准上部署了一个简单的Ruby 2.5.7应用程序。请记住,在app.yaml文件中指定
runtime:ruby25
,将使您的Ruby 2.5运行时环境使用最新稳定的Ruby 2.5(即cu)