Как я могу узнать, на какой операционной системе работает моя Ruby-программа? - PullRequest
81 голосов
/ 05 октября 2008

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

Ответы [ 10 ]

133 голосов
/ 05 октября 2008

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

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

21 голосов
/ 16 октября 2013

(Внимание: прочитайте комментарий @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 используется в сочетании с "Update! Addition! Rubygems nowed ... ..." для уменьшения при Gem::Platform.local.os == 'java'

16 голосов
/ 05 октября 2008

Или

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

или

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
8 голосов
/ 13 января 2014

У меня есть второй ответ, чтобы добавить больше возможностей для драки. 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
6 голосов
/ 05 октября 2008

Попробуйте Launchy самоцвет (gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
4 голосов
/ 03 декабря 2016

Обновление! Дополнение! Rubygems в настоящее время поставляется с Gem.win_platform?.

Пример использования в репо Rubygems , и этот, для ясности:

def self.ant_script
  Gem.win_platform? ? 'ant.bat' : 'ant'
end
4 голосов
/ 17 октября 2012
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
1 голос
/ 19 января 2016

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

  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 голосов
/ 14 марта 2019

Для чего-то легкодоступного в большинстве инсталляций 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! ( code )
    • Это все варианты Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE # => например. "ruby", "jruby"

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

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

0 голосов
/ 27 сентября 2013

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

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...