Je veux que mon programme Ruby fasse des choses différentes sur un Mac que sur Windows. Comment puis-je savoir sur quel système mon programme est exécuté?
Je veux que mon programme Ruby fasse des choses différentes sur un Mac que sur Windows. Comment puis-je savoir sur quel système mon programme est exécuté?
Réponses:
Utilisez la RUBY_PLATFORM
constante et éventuellement enveloppez-la dans un module pour la rendre plus conviviale:
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
Ce n'est pas parfait, mais fonctionne bien pour les plates-formes sur lesquelles je fais du développement, et c'est assez facile à étendre.
RbConfig::CONFIG["host_os"]
pour obtenir votre système d'exploitation.
(Attention: lire le commentaire de @Peter Wagenet) J'aime ça, la plupart des gens utilisent rubygems , c'est fiable, c'est multi-plateforme
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"
mise à jour à utiliser en conjonction avec "Update! Addition! Rubygems nowadays ..." pour atténuer leGem::Platform.local.os == 'java'
Soit
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
ou
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 ': Utilisez RbConfig au lieu de Config obsolète et obsolète.' Alors j'ai utilisé ça, RbConfig::CONFIG.each
et j'ai listé toutes les différentes valeurs. Peut-être pouvez-vous y trouver quelque chose pour vous aider à trouver ce que vous cherchez.
J'ai une deuxième réponse, pour ajouter plus d'options à la mêlée. L'os rubygem et leur page github ont une liste de projets associés.
nécessitent 'os' >> OS.windows? => true # ou OS.doze? >> OS.bits => 32 >> OS.java? => true # si vous utilisez jruby. Aussi OS.jruby? >> OS.ruby_bin => "c: \ ruby18 \ bin \ ruby.exe" # ou "/ usr / local / bin / ruby" ou autre >> OS.posix? => false # true pour linux, os x, cygwin >> OS.mac? # ou OS.osx? ou OS.x? => faux
Essayez la gemme 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']
... + pas besoin d'inclure leConfig
include
ou les deux types de modules, et alors c'est la meilleure réponse IMO. Remarquez comment il a fait include
le module, donc pas besoin de RbConfig ou Config.
Mise à jour! Une addition! Rubygems est désormais livré avec Gem.win_platform?
.
Exemples d'utilisations dans le repo Rubygems , et celui-ci, pour plus de clarté:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Nous nous sommes plutôt bien débrouillés avec le code suivant
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
Pour quelque chose de facilement accessible dans la plupart des installations Ruby qui est déjà quelque peu traité pour vous, je recommande ceux-ci:
Gem::Platform.local.os
# => par exemple. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( code )Gem.win_platform?
# => par exemple. vrai, faux ( code )Ces deux scripts et tous les autres scripts de vérification de plate-forme que je connais sont basés sur l'interprétation de ces variables sous-jacentes:
RbConfig::CONFIG["host_os"]
# => par exemple. "linux-gnu" (code 1 , 2 )RbConfig::CONFIG["arch"]
# => par exemple. "i686-linux", "i386-linux-gnu" (passé en paramètre lors de la compilation de l'interpréteur Ruby )RUBY_PLATFORM
# => par exemple. "i386-linux-gnu", "darwin" - Notez que cela renvoie "java" dans JRuby! ( code )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => par exemple. "ruby", "jruby"Les bibliothèques sont disponibles si la dépendance ne vous dérange pas et que vous voulez quelque chose d'un peu plus convivial. Plus précisément, OS propose des méthodes telles que OS.mac?
ou OS.posix?
. La plate-forme peut bien distinguer une variété de plates-formes Unix. Platform::IMPL
reviendra, par exemple. : linux,: freebsd,: netbsd,: hpux. sys-uname et sysinfo sont similaires. utilinfo est extrêmement basique et échouera sur tous les systèmes autres que Windows, Mac et Linux.
Si vous voulez des bibliothèques plus avancées avec des détails système spécifiques, comme différentes distributions Linux, consultez ma réponse pour Détecter la distribution Linux dans Ruby .
RUBY_PLATFORM
ou RbConfig::CONFIG["host_os"]
sont peuplés. En regardant le code, ce n'est toujours pas clair pour moi.
Lorsque j'ai juste besoin de savoir s'il s'agit d'un système d'exploitation de type Windows ou Unix, il suffit souvent de
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Il est préférable de taper la plate-forme comme un développement en Ruby. Mais si vous devez savoir si la plate-forme est Windows, posez la question au lieu d'essayer de la déduire.