Я хочу, чтобы моя программа Ruby выполняла разные действия на Mac, чем в Windows. Как узнать, в какой системе работает моя программа?
Как я могу найти, в какой операционной системе работает моя Ruby?
Ответ 1
Используйте константу 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
Он не идеален, но хорошо работает для платформ, на которых я занимаюсь разработкой, и его достаточно легко расширить.
Ответ 2
(Предупреждение: прочитайте комментарий @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"
обновлять использование в сочетании с "Обновить! Добавление! Rubygems в настоящее время...", чтобы уменьшить, когда Gem::Platform.local.os == 'java'
Ответ 3
Либо
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
или
irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Ответ 4
У меня есть второй ответ, чтобы добавить больше возможностей для драки. Os 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
Ответ 5
Попробуйте Launchy gem (gem install launchy
):
require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
Ответ 6
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
Ответ 7
Обновление! Дополнение! Rubygems в настоящее время поставляется с Gem.win_platform?
.
Примеры использования в репозитории Rubygems, и это для ясности:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Ответ 8
До сих пор мы неплохо справлялись со следующим кодом
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
Ответ 9
Для чего-то легкодоступного в большинстве установок 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! (код)- Это все варианты Windows:
/cygwin|mswin|mingw|bccwin|wince|emx/
- Это все варианты Windows:
-
RUBY_ENGINE
# => например. "ruby", "jruby"
Библиотеки доступны, если вы не возражаете против зависимости и хотите что-то более удобное для пользователя. В частности, ОС предлагает такие методы, как OS.mac?
или OS.posix?
, Платформа может хорошо различать различные платформы Unix. Platform::IMPL
вернется, например. : linux,: freebsd,: netbsd,: hpux. sys-uname и sysinfo похожи. Утилитаинформация чрезвычайно проста и не работает в любых системах, кроме Windows, Mac и Linux.
Если вам нужны более продвинутые библиотеки с конкретными сведениями о системе, например, с разными дистрибутивами Linux, см. Мой ответ для Обнаружение дистрибутива Linux в Ruby.
Ответ 10
Когда мне просто нужно знать, является ли это ОС Windows или Unix-подобной, часто бывает достаточно
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true