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é?
ruby
operating-system
Andrew Marshall
la source
la source
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.
la source
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 le
Gem::Platform.local.os == 'java'
la source
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"
la source
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.
la source
Essayez la gemme Launchy (
gem install launchy
):require 'launchy' Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
la source
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
la source
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 faitinclude
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
la source
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
la source
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?
ouOS.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 .
la source
RUBY_PLATFORM
ouRbConfig::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
la source
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.