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

Ответы:

142

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

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

Аарон Хинни
источник
8
для jruby вам лучше использовать, RbConfig::CONFIG["host_os"]чтобы получить свою ОС.
FilBot3 02
2
Есть ли где-нибудь что-то подобное, упакованное в драгоценный камень, которое можно было бы использовать вместо копирования / вставки или чего-то подобного? Если да, то где? :)
lindes
1
Я предпочитаю это любому драгоценному камню.
C Johnson
Есть ли способ проверить конкретную версию Windows, например Windows 8.1?
Саджид
Это регулярное выражение варианта Windows выключено, каждое имя должно быть в скобках для "|" или работать как положено.
Epigene
23

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

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

jtzero
источник
4
На jruby он просто сообщает "java", поэтому этого недостаточно, если вы ожидаете, что кто-то будет запускать jruby.
Peter Wagenet
17

Либо

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

или

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Винко Врсалович
источник
1
Вы не имеете в виду Config::CONFIG[‘host_os’]?
Эндрю Гримм
5
«Использовать RbConfig вместо устаревшего и устаревшего Config» =>RbConfig::CONFIG["arch"]
jtzero
1
@jtzero Если вы дадите более полный ответ в комментариях, я
обновлю
в ruby ​​1.9.3 (p327) это именно та строка, она есть в ruby ​​по умолчаниюirb(main):002:0> require 'rbconfig' => false
jtzero
Когда я это сделал, я получил заявление о том, что это обесценилось. (irb):10:in irb_binding ': используйте RbConfig вместо устаревшего и устаревшего Config. `Итак, я использовал его RbConfig::CONFIG.eachи перечислил все различные значения. Может быть, вы найдете там что-нибудь, что поможет вам найти то, что вы ищете.
FilBot3 02
9

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

требовать 'os'

>> OS.windows?
=> true # или OS.doze?

>> OS.bits
=> 32

>> OS.java?
=> true # если вы работаете в jruby. Также OS.jruby?

>> OS.ruby_bin
=> "c: \ ruby18 \ bin \ ruby.exe" # или "/ usr / local / bin / ruby" или что нет

>> OS.posix?
=> false # верно для linux, os x, cygwin

>> OS.mac? # или OS.osx? или OS.x?
=> ложь
jtzero
источник
7

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

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
Райан МакГири
источник
Это Launchy :: Application.new.host_os_family в 2.1.0.
fakeleft
1
К вашему сведению - Launchy использует rbconfig: github.com/copiousfreetime/launchy/blob/master/lib/launchy/…
codecraig
4
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
писарук
источник
Я думаю, это должно быть case Config::CONFIG['host_os']?
эквивалент 8
на самом деле в Ruby 2 это должно быть RbConfig::Obsolete::CONFIG['host_os'] ... + не нужно включатьConfig
эквивалент8
Измените один includeили оба типа модулей, и тогда это лучший ответ ИМО. Обратите внимание на то, как он includeразместил модуль, поэтому не нужно использовать RbConfig или Config.
FilBot3
2

Пока у нас неплохо получается со следующим кодом

  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
Адамлиско
источник
0

Для чего-то легкодоступного в большинстве установок 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# => например. "рубин", "рубин"

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

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

sondra.kinsey
источник
Я приветствую более точные объяснения или ссылки на то, как RUBY_PLATFORMили RbConfig::CONFIG["host_os"]заселены. Глядя на код, мне все еще непонятно.
sondra.kinsey
-6

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

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
димус
источник
1
File :: SEPARATOR дает / в окнах, поэтому это не работает
Питер
3
Плохая практика повсюду. Если вы хотите узнать, что такое разделитель файлов, используйте File::SEPARATOR. Лучше всего набирать платформу, как при разработке на Ruby. Но если вам нужно знать, является ли платформа Windows, задайте вопрос вместо того, чтобы пытаться вывести его.
Робин Догерти