Chcę, aby mój program Ruby robił inne rzeczy na komputerze Mac niż w systemie Windows. Jak mogę się dowiedzieć, na którym systemie działa mój program?
Chcę, aby mój program Ruby robił inne rzeczy na komputerze Mac niż w systemie Windows. Jak mogę się dowiedzieć, na którym systemie działa mój program?
Odpowiedzi:
Użyj RUBY_PLATFORM
stałej i opcjonalnie zawiń ją w moduł, aby była bardziej przyjazna:
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
Nie jest doskonały, ale działa dobrze na platformach, na których pracuję, i jest dość łatwy do rozszerzenia.
RbConfig::CONFIG["host_os"]
do pobrania systemu operacyjnego.
(Ostrzeżenie: przeczytaj komentarz @Peter Wagenet) Podoba mi się to, większość ludzi używa rubygemów , jest niezawodny, jest wieloplatformowy
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"
użycie aktualizacji w połączeniu z „Aktualizacja! Dodatek! Rubygems obecnie ...”, aby złagodzić kiedyGem::Platform.local.os == 'java'
Zarówno
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
lub
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 ': Użyj RbConfig zamiast przestarzałej i przestarzałej konfiguracji .` Więc użyłem tego RbConfig::CONFIG.each
i wymieniłem wszystkie różne wartości. Może znajdziesz tam coś, co pomoże Ci znaleźć to, czego szukasz.
Mam drugą odpowiedź, aby dodać więcej opcji do walki. Os rubygem i ich strona github zawiera listę powiązanych projektów.
wymagaj „os” >> OS.windows? => true # czy OS.doze? >> Bity systemu operacyjnego => 32 >> OS.java? => true # jeśli biegasz w jrubach. Również OS.jruby? >> OS.ruby_bin => „c: \ ruby18 \ bin \ ruby.exe” # lub „/ usr / local / bin / ruby” lub co nie >> OS.posix? => false # true dla linux, os x, cygwin >> OS.mac? # lub OS.osx? lub OS.x? => fałsz
Wypróbuj 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']
... + nie ma potrzeby dołączaniaConfig
include
lub oba typy modułów, a wtedy jest to najlepsza odpowiedź IMO. Zwróć uwagę, jak on include
był modułem, więc nie ma potrzeby używania RbConfig ani Config.
Aktualizacja! Dodanie! Obecnie Rubygems jest dostarczany z Gem.win_platform?
.
Przykładowe zastosowania w repozytorium Rubygems i to dla jasności:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Jak dotąd radzimy sobie całkiem nieźle z następującym kodem
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
W przypadku czegoś łatwo dostępnego w większości instalacji Rubiego, które jest już nieco przetworzone, polecam następujące:
Gem::Platform.local.os
# => np. „mingw32”, „java”, „linux”, „cygwin”, „aix”, „dalvik” ( kod )Gem.win_platform?
# => np. prawda, fałsz ( kod )Zarówno ten, jak i każdy inny skrypt sprawdzający platformę, który znam, opiera się na interpretacji tych podstawowych zmiennych:
RbConfig::CONFIG["host_os"]
# => np. „linux-gnu” (kod 1 , 2 )RbConfig::CONFIG["arch"]
# => np. "i686-linux", "i386-linux-gnu" (przekazywane jako parametr, gdy kompilowany jest interpreter języka Ruby )RUBY_PLATFORM
# => np. "i386-linux-gnu", "darwin" - Zwróć uwagę, że w JRuby zwraca to "java"! ( kod )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => np. „rubinowy”, „jruby”Biblioteki są dostępne, jeśli nie masz nic przeciwko zależnościom i chcesz czegoś bardziej przyjaznego dla użytkownika. W szczególności system operacyjny oferuje metody takie jak OS.mac?
lub OS.posix?
. Platforma może dobrze rozróżniać różne platformy Unix. Platform::IMPL
powróci np. : linux,: freebsd,: netbsd,: hpux. sys-uname i sysinfo są podobne. utilinfo jest niezwykle proste i zawiedzie w każdym systemie poza Windows, Mac i Linux.
Jeśli potrzebujesz bardziej zaawansowanych bibliotek z określonymi szczegółami systemu, takimi jak różne dystrybucje Linuksa, zobacz moją odpowiedź na temat wykrywania dystrybucji Linuksa w Rubim .
RUBY_PLATFORM
lub RbConfig::CONFIG["host_os"]
są wypełniane. Patrząc na kod, nadal nie jest to dla mnie jasne.
Kiedy chcę tylko wiedzieć, czy jest to system operacyjny Windows czy Unix, często wystarczy
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Platformę najlepiej jest tworzyć tak samo, jak w języku Ruby. Ale jeśli musisz wiedzieć, czy platformą jest Windows, zadaj pytanie zamiast próbować to wywnioskować.