如何正确检测Ruby是否在Windows上运行?

41

在 Ruby 中,如何正确地检测解释器是否在 Windows 上运行?“正确”包括适用于所有主要的 Ruby 版本,包括 1.8.x、1.9.x、JRuby、Rubinius 和 IronRuby。

目前谷歌搜索“ruby detect windows”的排名最高的结果都是不正确或已过时的。例如,一个不正确的方法是:

RUBY_PLATFORM =~ /mswin/

这是不正确的,因为它无法检测mingw版本或Windows上的JRuby。

正确的方法是什么呢?


8
为了完整起见,我经常看到的另一种错误方法是 RUBY_PLATFORM =~ /win/,这也忽略了MinGW端口(这是现在每个人实际使用的端口),更糟糕的是,它还匹配了Darwin即OSX。 - Jörg W Mittag
4个回答

72

这是来自RubyGems的内容,它被包含在MRI >= 1.9中。其他版本的Ruby需要包含这个gem才能使用它。了解这一点非常好,但并不完全符合OP的标准。 - aenw
3
以下是匹配的平台列表:https://github.com/rubygems/rubygems/blob/ac20ec2c0972569c76c7d344b0029016fcf5892f/lib/rubygems.rb#L122。 - sschuberth
3
这应该是答案。 - JaeGeeTee
我同意JaeGeeTee的观点 - 这种方法比正则表达式更加优雅,尽管它们同样有效。人们可以继续使用相同的代码,而不是每个人都必须依赖这些定制的、临时的正则表达式。我认为Gem.win_platform?在长期内会更易于维护,而正则表达式可能并不总是正确的,这取决于任何内部变化、不同的操作系统或风格等等。 - shevy

38

首选项(根据@John的建议更新)

require 'rbconfig'
is_windows = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)

这种方法也可以工作,但不够可靠(它不能在旧版本上工作,并且环境变量可能会被修改)

is_windows = (ENV['OS'] == 'Windows_NT')

(我无法轻松地在列出的所有Ruby版本或除Windows 7之外的任何操作系统上进行测试,但我知道两者都适用于1.9.x、IronRuby和JRuby)。


无法完成(需要最小字符数) - akostadinov
如果你想要布尔值,可以使用以下代码:!!(RbConfig :: CONFIG ['host_os']〜/ mswin | mingw | cygwin /) - Tilo

1
这对我来说非常完美。 此外,etc不需要安装,它与Ruby一起提供。
require "etc"
def check_system
  return "windows" if Etc.uname[:sysname] == "Windows_NT"
  return "linux" if Etc.uname[:sysname] == "Linux"
end

0
(File::ALT_SEPARATOR || File::SEPARATOR) == '\\'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接