Я хочу, щоб моя програма Ruby робила різні речі на Mac, ніж на Windows. Як я можу дізнатись, в якій системі працює моя програма?
Я хочу, щоб моя програма Ruby робила різні речі на Mac, ніж на Windows. Як я можу дізнатись, в якій системі працює моя програма?
Відповіді:
Використовуйте 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
Це не ідеально, але добре працює для платформ, на яких я розробляю, і його досить легко розширити.
RbConfig::CONFIG["host_os"]
щоб отримати свою ОС.
(Попередження: прочитайте коментар @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'
Або
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
або
irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Config::CONFIG[‘host_os’]
?
RbConfig::CONFIG["arch"]
irb(main):002:0> require 'rbconfig' => false
(irb):10:in
irb_binding ': Використовуйте RbConfig замість застарілого та застарілого Config. `Отже, я використав це RbConfig::CONFIG.each
і перерахував усі різні значення. Можливо, ви можете знайти там щось, що допоможе вам знайти те, що ви шукаєте.
У мене є друга відповідь, щоб додати більше варіантів до сутички. 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? => хибне
Спробуйте Launchy gem ( gem install launchy
):
require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
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']
?
RbConfig::Obsolete::CONFIG['host_os']
... + не потрібно включатиConfig
include
або обидва типи модулів, і тоді це найкраща відповідь IMO. Зверніть увагу, як він include
був модулем, тому немає необхідності в RbConfig або Config.
Оновлення! Додаток!У наш час Rubygems постачається зGem.win_platform?
.
Приклади використання в репозиторії Rubygems , і цей для наочності:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Наразі ми робили досить добре з наступним кодом
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
Для чогось легкодоступного в більшості інсталяцій Ruby, який вже дещо оброблений для вас, я рекомендую такі:
Gem::Platform.local.os
# => наприклад. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( код )Gem.win_platform?
# => наприклад. true, false ( код )І ці, і будь-який інший скрипт перевірки платформи, який я знаю, базується на інтерпретації цих базових змінних:
RbConfig::CONFIG["host_os"]
# => наприклад. "linux-gnu" (код 1 , 2 )RbConfig::CONFIG["arch"]
# => наприклад. "i686-linux", "i386-linux-gnu" (передається як параметр при компіляції інтерпретатора Ruby )RUBY_PLATFORM
# => наприклад. "i386-linux-gnu", "darwin" - Зверніть увагу, що це повертає "java" у JRuby! ( код )
/cygwin|mswin|mingw|bccwin|wince|emx/
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"]
заповнюються. Дивлячись на код, мені все ще незрозуміло.
Коли мені просто потрібно знати, чи це Windows, або Unix-подібна ОС, цього часто досить
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Найкраще підбирати платформу так само, як розробляти в Ruby. Але якщо вам потрібно знати, чи є платформа Windows, поставте питання, замість того, щоб намагатися зробити висновок.