在 Gemfile 和 .ruby-version Dotfile 中同时列出 Ruby 版本是一种不好的做法吗?
Is It A Bad Practice to List Ruby Version in Both Gemfile and .ruby-version Dotfile?
我最近的 Rails 项目或多或少都是实验,让我打破很多东西并在过程中学习。我的 gemfile 中指定了最新版本的 Ruby:
ruby '2.2.3'
而且我在项目中还有一个.ruby-version
点文件,内容如下:
2.2.3
除了明显的重复之外,这还有什么问题?这两个公约的目的是什么?如果我应该只有一个约定来列出我的 Ruby 版本,为什么我应该有一个 (Gemfile) 而不是另一个 (dotfile)?
在一个项目中同时使用这两种约定是否完全没问题?
我将成为这个实验项目的唯一维护者,我不认为必须维护这个微妙的重复项会是个问题。我不打算为这个项目升级 Ruby,如果我这样做,记住在两个地方都做这件事就没有问题了。除了这个细节,我当然会避免在我的应用程序代码库中出现任何此类重复。
它们分别由不同的团队在不同的时间开发,并被不同的软件使用。
在 Gemfile 中列出 ruby 版本是 feature in bundler。
由于 Gemfile 主要仅由捆绑器使用,它主要只会在您 运行 使用捆绑器时产生影响——使用 bundle exec
或软件(如 Rails)自动为您触发捆绑器。如果您没有使用指定的 ruby 版本,它的效果就是简单地出错并拒绝 运行。这是一个要求 -- 运行 在这个 ruby 下,否则我会抛出一个错误警告你 运行 宁在错误的 ruby 下。
但是,heroku also pays attention to the version specified in the Gemfile, and will run under that version. Heroku decided to use the feature in bundler too. But most other software, on your workstation, or even travis 不使用该约定。 (Travis 让您编辑 .travis.yml ENV 以指定要使用的 ruby 版本)。
2012 年 8 月在 Bundler 1.2 中引入了 bundler 中的功能。
.ruby-version file was first introduced by rvm,第一个ruby版本管理器。如果您正在使用 rvm,并且您切换到带有 .ruby-version
文件的项目目录,rvm 将自动将您的 shell 切换为使用指定的 ruby 版本。
我不确定 rvm 什么时候引入这个特性,但我认为在 Gemfile "ruby" 特性之前。
自rvm引入后,其他ruby版本切换软件如rbenv和chruby也采用了它做同样的事情——自动切换到指定的ruby版本当您 cd
进入目录时。尽管我认为 rbenv 和 chruby 两者都可能是可选功能。
所以它们是在不同的时间引入不同的软件包并由它们支持的不同功能,做一些不同的事情。
我同意维护两者并保持同步会很烦人。
它们实际上都是可选的,您不需要使用任何一个。除了你可能需要使用 heroku 的 Gemfile ruby 规范,告诉它你想要哪个 ruby 到 运行。
我个人也不使用。但是如果你需要在不同的项目中使用不同的 ruby 版本,并且发现让你的 ruby 版本管理器(rvm、rbenv 或 chruby)自动切换到合适的位置会很方便项目特定 ruby 版本,.ruby-version
可能有用。
除了 heroku 的目的,在 Gemfile 中列出 ruby 主要是为了防止自己犯错误,例如在部署时。或者也许内部自动化部署或 CI 环境可以像 heroku 那样使用它们,或者其他云部署堆栈将或已经采用它。我想很多人发现它不太有用 -- 这个也是,我不会使用,直到你 运行 进入或看到它正在解决的问题。一些人在 Gemfile 中列出 ruby 版本时遇到的一个不便之处是,随着新的 rubies 不断出现,你必须一直更新所有的 Gemfiles。
总的来说,最近几年的 ruby 版本都非常向后兼容,限制了确保您使用 ruby 的确切版本的需要,最新的代码将运行 在最新的 ruby 上,即使它最初是为旧版本编写的。
我认为这两个功能都不能让您指定一系列 ruby 版本,例如 2.2.*
或您有什么。
具有 either/both 功能,只有在您需要它们或发现它们有用时才使用它们,您不必使用任何一个,并且可以(如果烦人)同时使用两者,如果您两者都需要做。
由于 Gemfile 是实时 ruby 代码,理论上您可以让 Gemfile 读取您的 .ruby-version
文件并自动将该值用作 Gemfile ruby
值。如果你想同时使用两者,并使用 "don't repeat yourself" 。我不知道这是否是一种常见的做法,我只是想到了。但它应该工作正常。
我认为最好避免列出相同的信息两次,除非有充分的理由 - 即保持干燥。
您可以将 ruby 版本存储在“.ruby-版本”中,然后在 Gemfile 中执行如下操作:
ruby File.read('.ruby-version').strip
我最初发布了以下内容,然后 collimarco 将其缩短为以上内容:
ruby File.open('.ruby-version', 'rb') { |f| f.read.chomp }
如果你这样做,那么每当你改变 .ruby-version 时,Gemfile 都会神奇地做同样的事情。
在你的Gemfile
中使用这个:
ruby File.read('.ruby-version').strip
优点:
- 干燥
- 您不要忘记更新其中一个文件中的版本
- 它确保您始终运行 正确的版本。
我最近的 Rails 项目或多或少都是实验,让我打破很多东西并在过程中学习。我的 gemfile 中指定了最新版本的 Ruby:
ruby '2.2.3'
而且我在项目中还有一个.ruby-version
点文件,内容如下:
2.2.3
除了明显的重复之外,这还有什么问题?这两个公约的目的是什么?如果我应该只有一个约定来列出我的 Ruby 版本,为什么我应该有一个 (Gemfile) 而不是另一个 (dotfile)?
在一个项目中同时使用这两种约定是否完全没问题?
我将成为这个实验项目的唯一维护者,我不认为必须维护这个微妙的重复项会是个问题。我不打算为这个项目升级 Ruby,如果我这样做,记住在两个地方都做这件事就没有问题了。除了这个细节,我当然会避免在我的应用程序代码库中出现任何此类重复。
它们分别由不同的团队在不同的时间开发,并被不同的软件使用。
在 Gemfile 中列出 ruby 版本是 feature in bundler。
由于 Gemfile 主要仅由捆绑器使用,它主要只会在您 运行 使用捆绑器时产生影响——使用 bundle exec
或软件(如 Rails)自动为您触发捆绑器。如果您没有使用指定的 ruby 版本,它的效果就是简单地出错并拒绝 运行。这是一个要求 -- 运行 在这个 ruby 下,否则我会抛出一个错误警告你 运行 宁在错误的 ruby 下。
但是,heroku also pays attention to the version specified in the Gemfile, and will run under that version. Heroku decided to use the feature in bundler too. But most other software, on your workstation, or even travis 不使用该约定。 (Travis 让您编辑 .travis.yml ENV 以指定要使用的 ruby 版本)。
2012 年 8 月在 Bundler 1.2 中引入了 bundler 中的功能。
.ruby-version file was first introduced by rvm,第一个ruby版本管理器。如果您正在使用 rvm,并且您切换到带有 .ruby-version
文件的项目目录,rvm 将自动将您的 shell 切换为使用指定的 ruby 版本。
我不确定 rvm 什么时候引入这个特性,但我认为在 Gemfile "ruby" 特性之前。
自rvm引入后,其他ruby版本切换软件如rbenv和chruby也采用了它做同样的事情——自动切换到指定的ruby版本当您 cd
进入目录时。尽管我认为 rbenv 和 chruby 两者都可能是可选功能。
所以它们是在不同的时间引入不同的软件包并由它们支持的不同功能,做一些不同的事情。
我同意维护两者并保持同步会很烦人。
它们实际上都是可选的,您不需要使用任何一个。除了你可能需要使用 heroku 的 Gemfile ruby 规范,告诉它你想要哪个 ruby 到 运行。
我个人也不使用。但是如果你需要在不同的项目中使用不同的 ruby 版本,并且发现让你的 ruby 版本管理器(rvm、rbenv 或 chruby)自动切换到合适的位置会很方便项目特定 ruby 版本,.ruby-version
可能有用。
除了 heroku 的目的,在 Gemfile 中列出 ruby 主要是为了防止自己犯错误,例如在部署时。或者也许内部自动化部署或 CI 环境可以像 heroku 那样使用它们,或者其他云部署堆栈将或已经采用它。我想很多人发现它不太有用 -- 这个也是,我不会使用,直到你 运行 进入或看到它正在解决的问题。一些人在 Gemfile 中列出 ruby 版本时遇到的一个不便之处是,随着新的 rubies 不断出现,你必须一直更新所有的 Gemfiles。
总的来说,最近几年的 ruby 版本都非常向后兼容,限制了确保您使用 ruby 的确切版本的需要,最新的代码将运行 在最新的 ruby 上,即使它最初是为旧版本编写的。
我认为这两个功能都不能让您指定一系列 ruby 版本,例如 2.2.*
或您有什么。
具有 either/both 功能,只有在您需要它们或发现它们有用时才使用它们,您不必使用任何一个,并且可以(如果烦人)同时使用两者,如果您两者都需要做。
由于 Gemfile 是实时 ruby 代码,理论上您可以让 Gemfile 读取您的 .ruby-version
文件并自动将该值用作 Gemfile ruby
值。如果你想同时使用两者,并使用 "don't repeat yourself" 。我不知道这是否是一种常见的做法,我只是想到了。但它应该工作正常。
我认为最好避免列出相同的信息两次,除非有充分的理由 - 即保持干燥。
您可以将 ruby 版本存储在“.ruby-版本”中,然后在 Gemfile 中执行如下操作:
ruby File.read('.ruby-version').strip
我最初发布了以下内容,然后 collimarco 将其缩短为以上内容:
ruby File.open('.ruby-version', 'rb') { |f| f.read.chomp }
如果你这样做,那么每当你改变 .ruby-version 时,Gemfile 都会神奇地做同样的事情。
在你的Gemfile
中使用这个:
ruby File.read('.ruby-version').strip
优点:
- 干燥
- 您不要忘记更新其中一个文件中的版本
- 它确保您始终运行 正确的版本。