它们分别由不同的团队在不同的时间开发,并由不同的软件使用。
在 Gemfile 中列出 ruby 版本是bundler 中的一项功能。
由于 Gemfile 主要仅由 bundler 使用,因此它主要只会在您运行 with bundler 时产生影响——使用bundle exec
自动为您触发 bundler 的软件(如 Rails)。如果您没有使用指定的 ruby 版本,它的效果只是出错并拒绝运行。这是一个要求——在这个 ruby 下运行,否则我会抛出一个错误警告你在错误的 ruby 下运行。
但是,heroku 也会注意Gemfile 中指定的版本,并将在该版本下运行。Heroku 也决定在 bundler 中使用该功能。但是您的工作站上的大多数其他软件,甚至是travis,都不使用该约定。(Travis 让您编辑 .travis.yml ENV 以指定要使用的 ruby 版本)。
bundler 中的功能于 2012 年 8 月在 Bundler 1.2 中引入。
.ruby -version文件首先由第一个 ruby 版本管理器rvm引入。如果您使用的是 rvm,并且您切换到带有.ruby-version
文件的项目目录,rvm 会自动将您的 shell 切换为使用指定的 ruby 版本。
我不确定 rvm 何时引入此功能,但我认为是在 Gemfile 的“ruby”功能之前。
自从 rvm 引入它之后,其他 ruby 版本切换软件如 rbenv 和 chruby 也采用了它来做同样的事情——当你cd
进入目录时自动切换到指定的 ruby 版本。虽然我认为 rbenv 和 chruby 都可能是一个可选功能。
所以它们是不同的软件包在不同的时间引入和支持的不同特性,做的事情有些不同。
我同意维护两者并保持同步会很烦人。
它们实际上都是可选的,您不需要使用任何一个。除了您可能需要使用 Heroku 的 Gemfile ruby 规范,告诉它您希望它运行哪个 ruby。
我个人也不用。但是,如果您需要在不同的项目中使用不同的 ruby 版本,并且发现让您的 ruby 版本管理器(rvm、rbenv 或 chruby)自动切换到正确的项目特定的 ruby 版本很方便,.ruby-version
这可能会很有用。
除了 heroku 的目的,在 Gemfile 中列出 ruby 主要是为了防止自己犯错误,例如在部署时。或者,内部自动化部署或 CI 环境可能会像 heroku 一样使用它们,或者其他云部署堆栈将会或已经采用它。我认为许多人发现它并不太有用——这个也是,我不会使用,直到你遇到或看到它正在解决的问题。有些人在 Gemfile 中列出 ruby 版本的一个不便之处在于,随着新的 ruby 总是出现,你必须一直更新所有的 Gemfile。
一般来说,过去几年的 ruby 版本都非常向后兼容,限制了确保您使用的是 ruby 的确切版本的需要,最新的代码将在最新的 ruby 上运行,即使它最初是编写的对于一个年长的人。
我不相信任何一个功能都可以让你指定一系列 ruby 版本,比如2.2.*
你有什么。
使用其中一个/两个功能,仅在您需要它们或发现它们有用时才使用它们,您不必使用任何一个,并且如果您需要两者都可以使用它们很好(如果烦人)。
由于 Gemfile 是实时 ruby 代码,理论上您可以让 Gemfile 读取.ruby-version
文件并自动使用该值作为 Gemfileruby
值。如果您想同时使用两者,并且“不要重复自己”。我不知道这是否是一种常见的事情,我只是想到了它。但它应该可以正常工作。