Я хочу, чтобы моя программа на Ruby делала на Mac разные вещи, чем на Windows. Как я могу узнать, в какой системе работает моя программа?
Как узнать, в какой операционной системе работает моя программа на Ruby?
Ответы (10)
Используйте константу 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"]
для получения вашей ОС.
- person FilBot3; 02.12.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 использовать вместе с "Обновление! Дополнение! Сегодня Rubygems..." для смягчения последствий при Gem::Platform.local.os == 'java'
Либо
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
or
irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Config::CONFIG[‘host_os’]
?
- person Andrew Grimm; 23.04.2010
RbConfig::CONFIG["arch"]
- person jtzero; 16.10.2013
irb(main):002:0> require 'rbconfig' => false
- person jtzero; 18.10.2013
(irb):10:in
irb_binding': используйте RbConfig вместо устаревшего и устаревшего Config.` Так что я использовал это, RbConfig::CONFIG.each
и перечислил все различные значения. Возможно, вы сможете найти там что-то, что поможет вам найти то, что вы ищете.
- person FilBot3; 02.12.2013
RUBY_PLATFORM
в порядке. Из Config::CONFIG
надежно работают только target_os
и host_os
. Как и в случае с jruby, только они указывают на linux.
- person akostadinov; 13.06.2015
У меня есть второй ответ, чтобы добавить больше возможностей в бой. Операционная система 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
Попробуйте драгоценный камень Launchy (gem install launchy
):
require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
Обновить! Дополнение! В настоящее время 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
#=> eg. "i386-linux-gnu", "darwin" - Note that this returns "java" in JRuby! (code)- These are all Windows variants:
/cygwin|mswin|mingw|bccwin|wince|emx/
- These are all Windows variants:
RUBY_ENGINE
#=> например. "руби", "джруби"
Библиотеки доступны, если вы не возражаете против зависимости и хотите что-то более удобное для пользователя. В частности, OS предлагает такие методы, как OS.mac?
или OS.posix?
. Платформа хорошо различает различные платформы Unix. Platform::IMPL
вернется, например. :linux, :freebsd, :netbsd, :hpux. sys-uname и sysinfo похожи. utilinfo чрезвычайно прост и не работает на любых системах, кроме Windows, Mac и линукс.
Если вам нужны более продвинутые библиотеки с конкретными сведениями о системе, например разные дистрибутивы Linux, см. мой ответ для Обнаружение дистрибутива Linux в Ruby.
RUBY_PLATFORM
или RbConfig::CONFIG["host_os"]
. Глядя на код, мне все еще не ясно.
- person sondra.kinsey; 14.03.2019
Когда мне просто нужно знать, Windows это или Unix-подобная ОС, часто бывает достаточно
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Лучше всего не использовать платформу, как при разработке на Ruby. Но если вам нужно знать, является ли платформа Windows, задайте вопрос, а не пытайтесь сделать вывод.
- person Robin Daugherty; 20.07.2014
case Config::CONFIG['host_os']
?
- person equivalent8; 05.03.2015
RbConfig::Obsolete::CONFIG['host_os']
...+ не нужно включать Config
- person equivalent8; 05.03.2015
include
или оба типа модулей, и тогда это лучший ответ IMO. Обратите внимание, как он include
сделал модуль, так что нет необходимости в RbConfig или Config.
- person FilBot3; 31.05.2016