Voglio che il mio programma Ruby faccia cose diverse su un Mac che su Windows. Come posso sapere su quale sistema è in esecuzione il mio programma?
Voglio che il mio programma Ruby faccia cose diverse su un Mac che su Windows. Come posso sapere su quale sistema è in esecuzione il mio programma?
Risposte:
Usa la RUBY_PLATFORM
costante e opzionalmente racchiudila in un modulo per renderlo più amichevole:
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
Non è perfetto, ma funziona bene per le piattaforme su cui sviluppo ed è abbastanza facile da estendere.
RbConfig::CONFIG["host_os"]
per ottenere il tuo sistema operativo.
(Attenzione: leggi il commento di @Peter Wagenet) Mi piace, la maggior parte delle persone usa rubygems , è affidabile, è multipiattaforma
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 usare insieme a "Update! Addition! Rubygems nowadays ..." per mitigare quandoGem::Platform.local.os == 'java'
O
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
o
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 ': Usa RbConfig invece di una configurazione obsoleta e deprecata. Quindi l'ho usata ed ho RbConfig::CONFIG.each
elencato tutti i diversi valori. Forse puoi trovare qualcosa che ti aiuti a trovare quello che stai cercando.
Ho una seconda risposta, per aggiungere più opzioni alla mischia. L'os rubygem e la loro pagina github hanno un elenco di progetti correlati.
richiedono 'os' >> OS.windows? => true # o OS.doze? >> OS.bits => 32 >> OS.java? => true # se corri in jruby. Anche OS.jruby? >> OS.ruby_bin => "c: \ ruby18 \ bin \ ruby.exe" # o "/ usr / local / bin / ruby" o cosa no >> OS.posix? => false # true per linux, os x, cygwin >> OS.mac? # o OS.osx? o OS.x? => falso
Prova la gemma Launchy ( 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']
... + alcuna necessità di includere ilConfig
include
o entrambi i tipi di moduli, e quindi questa è la migliore risposta IMO. Nota come ha fatto include
il modulo, quindi non c'è bisogno di RbConfig o Config.
Aggiornare! Aggiunta! Rubygems al giorno d'oggi viene fornito con Gem.win_platform?
.
Esempi di utilizzo nel repository Rubygems e questo, per chiarezza:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Finora abbiamo lavorato abbastanza bene con il codice seguente
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
Per qualcosa di facilmente accessibile nella maggior parte delle installazioni Ruby che è già in qualche modo elaborato per te, ti consiglio questi:
Gem::Platform.local.os
# => ad es. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( codice )Gem.win_platform?
# => ad es. vero, falso ( codice )Sia questi che tutti gli altri script di controllo della piattaforma che conosco si basano sull'interpretazione di queste variabili sottostanti:
RbConfig::CONFIG["host_os"]
# => ad es. "linux-gnu" (codice 1 , 2 )RbConfig::CONFIG["arch"]
# => ad es. "i686-linux", "i386-linux-gnu" (passato come parametro quando viene compilato l'interprete Ruby )RUBY_PLATFORM
# => es. "i386-linux-gnu", "darwin" - Nota che questo restituisce "java" in JRuby! ( codice )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => ad es. "rubino", "jruby"Le librerie sono disponibili se non ti dispiace la dipendenza e vuoi qualcosa di un po 'più user-friendly. In particolare, il sistema operativo offre metodi come OS.mac?
o OS.posix?
. La piattaforma può distinguere bene tra una varietà di piattaforme Unix. Platform::IMPL
tornerà, ad es. : linux,: freebsd,: netbsd,: hpux. sys-uname e sysinfo sono simili. utilinfo è estremamente semplice e non funzionerà su tutti i sistemi oltre a Windows, Mac e Linux.
Se desideri librerie più avanzate con dettagli di sistema specifici, come diverse distribuzioni Linux, vedi la mia risposta per Rilevamento della distribuzione Linux in Ruby .
RUBY_PLATFORM
o RbConfig::CONFIG["host_os"]
sono popolati. Guardando il codice, non mi è ancora chiaro.
Quando ho solo bisogno di sapere se si tratta di un sistema operativo Windows o Unix, spesso è sufficiente
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. È meglio digitare la piattaforma in modo anatra come lo sviluppo in Ruby. Ma se devi sapere se la piattaforma è Windows, fai la domanda invece di cercare di dedurla.