Как я могу найти, в какой операционной системе работает моя Ruby?

Я хочу, чтобы моя программа Ruby выполняла разные действия на Mac, чем в Windows. Как узнать, в какой системе работает моя программа?

Ответ 1

Используйте константу 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

Он не идеален, но хорошо работает для платформ, на которых я занимаюсь разработкой, и его достаточно легко расширить.

Ответ 2

(Предупреждение: прочитайте комментарий @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"

обновлять использование в сочетании с "Обновить! Добавление! Rubygems в настоящее время...", чтобы уменьшить, когда Gem::Platform.local.os == 'java'

Ответ 3

Либо

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

или

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"

Ответ 4

У меня есть второй ответ, чтобы добавить больше возможностей для драки. Os rubygem и их страница на github имеют список связанных проектов.

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

Ответ 5

Попробуйте Launchy gem (gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 

Ответ 6

require 'rbconfig'
include Config

case CONFIG['host_os']
  when /mswin|windows/i
    # Windows
  when /linux|arch/i
    # Linux
  when /sunos|solaris/i
    # Solaris
  when /darwin/i
    #MAC OS X
  else
    # whatever
end

Ответ 8

До сих пор мы неплохо справлялись со следующим кодом

  def self.windows?
    return File.exist? "c:/WINDOWS" if RUBY_PLATFORM == 'java'
    RUBY_PLATFORM =~ /mingw32/ || RUBY_PLATFORM =~ /mswin32/
  end

  def self.linux?
    return File.exist? "/usr" if RUBY_PLATFORM == 'java'
    RUBY_PLATFORM =~ /linux/
  end

  def self.os
    return :linux if self.linux?
    return :windows if self.windows?
    nil
  end

Ответ 9

Для чего-то легкодоступного в большинстве установок Ruby, который уже несколько обработан для вас, я рекомендую это:

  1. Gem::Platform.local.os # => например. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" (код)
  2. Gem.win_platform? # => например. правда, ложь (код)

И этот, и любой другой скрипт проверки платформы, который я знаю, основан на интерпретации этих базовых переменных:

  1. RbConfig::CONFIG["host_os"] # => например. "linux-gnu" (код 1, 2)
  2. RbConfig::CONFIG["arch"] # => например. "i686-linux", "i386-linux-gnu" (передается как параметр при компиляции интерпретатора Ruby)
  3. RUBY_PLATFORM # => например. "i386-linux-gnu", "darwin" - обратите внимание, что это возвращает "java" в JRuby! (код)
    • Это все варианты Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE # => например. "ruby", "jruby"

Библиотеки доступны, если вы не возражаете против зависимости и хотите что-то более удобное для пользователя. В частности, ОС предлагает такие методы, как OS.mac? или OS.posix? , Платформа может хорошо различать различные платформы Unix. Platform::IMPL вернется, например. : linux,: freebsd,: netbsd,: hpux. sys-uname и sysinfo похожи. Утилитаинформация чрезвычайно проста и не работает в любых системах, кроме Windows, Mac и Linux.

Если вам нужны более продвинутые библиотеки с конкретными сведениями о системе, например, с разными дистрибутивами Linux, см. Мой ответ для Обнаружение дистрибутива Linux в Ruby.

Ответ 10

Когда мне просто нужно знать, является ли это ОС Windows или Unix-подобной, часто бывает достаточно

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true