Як я можу знайти, на якій операційній системі працює моя програма 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

2
Чи є де-небудь, де щось подібне упаковано у дорогоцінний камінь, який можна було б використовувати замість копіювання / вставки чи іншого подібного? Якщо так, то де? :)
lindes

1
Я віддаю перевагу цьому перед будь-якою самоцвітом.
С Джонсон,

Чи є спосіб перевірити наявність певної версії Windows, наприклад Windows 8.1?
Саджид,

Якщо регулярний вираз варіанту Windows вимкнено, кожна назва повинна бути в дужках для "|" або працювати, як очікувалося.
Epigene

23

(Попередження: прочитайте коментар @Peter Wagenet) Мені подобається це, більшість людей використовують рубіми , це надійно, це крос-платформа

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'


4
На jruby він просто повідомляє "java", тому цього недостатньо, якщо ви очікуєте, що хтось буде запускати jruby.
Пітер Вагенет

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 Якщо ви надасте більш повну відповідь у коментарях, я оновлю відповідь, написану у 2008 році
Vinko Vrsalovic

у 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

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 # true для linux, os x, cygwin

>> OS.mac? # або OS.osx? або OS.x?
=> хибне


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']?
еквівалент

насправді в ruby ​​2 це повинно бути RbConfig::Obsolete::CONFIG['host_os'] ... + не потрібно включатиConfig
еквівалент8

Змініть includeабо обидва типи модулів, і тоді це найкраща відповідь IMO. Зверніть увагу, як він 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?# => наприклад. true, false ( код )

І ці, і будь-який інший скрипт перевірки платформи, який я знаю, базується на інтерпретації цих базових змінних:

  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 .


Я хотів би отримати більш точні пояснення або посилання на те, як 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
Файл :: SEPARATOR дає / in windows, тому це не працює
Peter

3
Навколо погана практика. Якщо ви хочете знати, що таке роздільник файлів, використовуйте File::SEPARATOR. Найкраще підбирати платформу так само, як розробляти в Ruby. Але якщо вам потрібно знати, чи є платформа Windows, поставте питання, замість того, щоб намагатися зробити висновок.
Робін Догерті,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.