Я хочу, чтобы моя программа 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) Мне это нравится, большинство людей используют 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'
Либо
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 # верно для 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
или оба типа модулей, и тогда это лучший ответ ИМО. Обратите внимание на то, как он 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?
# => например. истина, ложь ( код )И эти, и все другие известные мне скрипты проверки платформы основаны на интерпретации этих базовых переменных:
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, задайте вопрос вместо того, чтобы пытаться вывести его.