Я хочу, чтобы моя программа Ruby выполняла разные функции на Mac и в Windows. Как я могу узнать, в какой системе работает моя программа?
ruby
operating-system
Эндрю Маршалл
источник
источник
Ответы:
Используйте
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 содержат список связанных проектов.
источник
Попробуйте 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, задайте вопрос вместо того, чтобы пытаться вывести его.