如何找到运行Ruby程序的操作系统?

82 ruby operating-system

我希望我的Ruby程序在Mac上执行与在Windows上不同的操作.如何找出我的程序运行的系统?

Aar*_*nni 134

使用RUBY_PLATFORM常量,并可选择将其包装在模块中以使其更友好:

module OS
  def OS.windows?
    (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
  end

  def OS.mac?
   (/darwin/ =~ RUBY_PLATFORM) != nil
  end

  def OS.unix?
    !OS.windows?
  end

  def OS.linux?
    OS.unix? and not OS.mac?
  end

  def OS.jruby?
    RUBY_ENGINE == 'jruby'
  end
end
Run Code Online (Sandbox Code Playgroud)

它并不完美,但适用于我开发的平台,并且很容易扩展.

  • 一个不起作用的情况是你使用jruby. (7认同)
  • 对于jruby,你最好使用`RbConfig :: CONFIG ["host_os"]来获得你的操作系统. (7认同)
  • 有没有像这样的东西打包成宝石,可以使用,而不是复制/粘贴等?如果是的话,在哪里?:) (2认同)
  • 与任何宝石相比,我更喜欢这个。 (2认同)

jtz*_*ero 22

(警告:阅读@Peter Wagenet的评论)我喜欢这个,大多数人使用rubygems,它的可靠性,是跨平台的

irb(main):001:0> Gem::Platform.local
=> #<Gem::Platform:0x151ea14 @cpu="x86", @os="mingw32", @version=nil>
irb(main):002:0> Gem::Platform.local.os
=> "mingw32"
Run Code Online (Sandbox Code Playgroud)

更新"Update!Addition!Rubygems nowadays ..."结合使用以缓解何时Gem::Platform.local.os == 'java'

  • 在jruby上它只报告"java",所以如果你希望任何人都运行jruby是不够的. (3认同)

Vin*_*vic 17

irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
Run Code Online (Sandbox Code Playgroud)

要么

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Run Code Online (Sandbox Code Playgroud)

  • "使用RbConfig代替过时和弃用的Config"=>```RbConfig :: CONFIG ["arch"]``` (5认同)

jtz*_*ero 9

我有第二个答案,为战斗添加更多选项. os ruby​​gemgithub页面有一个相关的项目列表.

require 'os'

>> OS.windows?
=> true   # or OS.doze?

>> OS.bits
=> 32

>> OS.java?
=> true # if you're running in jruby.  Also OS.jruby?

>> OS.ruby_bin
=> "c:\ruby18\bin\ruby.exe" # or "/usr/local/bin/ruby" or what not

>> OS.posix?
=> false # true for linux, os x, cygwin

>> OS.mac? # or OS.osx? or OS.x?
=> false


son*_*sey 7

OS gem 是最用户友好的库,提供诸如OS.mac?之类的方法OS.posix?。它很小并且仅依赖于Ruby 标准库

对于大多数 Ruby 安装中已经为您处理过的易于访问的内容,请尝试以下操作:

  1. Gem.win_platform?#=> 例如。真、假(代码
  2. Gem::Platform.local.os#=> 例如。“mingw32”、“java”、“linux”、“cygwin”、“aix”、“dalvik”(代码

这些以及我所知道的所有其他平台检查脚本都是基于解释这些底层变量:

  1. RbConfig::CONFIG["host_os"]#=> 例如。“linux-gnu”(代码12
  2. RbConfig::CONFIG["arch"]#=> 例如。“i686-linux”、“i386-linux-gnu”(编译 Ruby 解释器时作为参数传递)
  3. RUBY_PLATFORM#=> 例如。“i386-linux-gnu”、“darwin” -请注意,这在 JRuby 中返回“java”!(代码) 这些都是 Windows 变体:/cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE#=> 例如。“红宝石”、“红宝石”

其他库包括Platform,它可以很好地区分各种 Unix 平台。Platform::IMPL将返回,例如。:Linux,:freebsd,:netbsd,:hpux。sys-unamesysinfo类似。utilinfo非常基础,在 Windows、Mac 和 Linux 之外的任何系统上都会失败。

如果您想要具有特定系统详细信息的更高级库,例如不同的 Linux 发行版,请参阅我的答案Detecting Linux distribution in Ruby

此外,您可能会考虑功能检测,而不是尝试嗅探操作系统。


Rya*_*ary 6

试试Launchy gem(gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考 - Launchy 使用 rbconfig:https://github.com/copiousfreetime/launchy/blob/master/lib/launchy/detect/host_os.rb (3认同)

oll*_*lle 6

更新!添加!如今,Rubygems 附带Gem.win_platform?.

为了清楚起见, Rubygems 存储库中的示例用法和此示例:

def self.ant_script
  Gem.win_platform? ? 'ant.bat' : 'ant'
end
Run Code Online (Sandbox Code Playgroud)