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?
ruby
operating-system
Andrew Marshall
źródło
źródło
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.
źródło
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ć kiedy
Gem::Platform.local.os == 'java'
źródło
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"
źródło
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 tegoRbConfig::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.
źródło
Wypróbuj Launchy gem (
gem install launchy
):require 'launchy' Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
źródło
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
źródło
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 oninclude
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
źródło
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
źródło
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?
lubOS.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 .
źródło
RUBY_PLATFORM
lubRbConfig::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
źródło
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ć.