Je veux que mon programme Ruby fasse des choses différentes sur un Mac et sur Windows. Comment puis-je savoir sur quel système mon programme s'exécute ?
Réponses
Trop de publicités?Utilisez le RUBY_PLATFORM
et, éventuellement, l'envelopper dans un module pour le rendre plus convivial :
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
Il n'est pas parfait, mais fonctionne bien pour les plateformes sur lesquelles je développe, et il est assez facile à étendre.
(Avertissement : lire le commentaire de @Peter Wagenet ) J'aime ça, la plupart des gens utilisent rubygems il est fiable, il est multiplateforme
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 "Mise à jour ! Ajout ! Rubygems de nos jours..." à atténuer lorsque Gem::Platform.local.os == 'java'
J'ai une deuxième réponse, pour ajouter d'autres options à la mêlée. L'os rubygem et leurs page github a une liste de projets connexes.
require 'os'
>> OS.windows?
=> true # or OS.doze?
>> OS.bits
=> 32
>> OS.java?
=> true # if you're running in jruby. Also OS.jruby?
>> OS.ruby\_bin
=> "c:\\ruby18\\bin\\ruby.exe" # or "/usr/local/bin/ruby" or what not
>> OS.posix?
=> false # true for linux, os x, cygwin
>> OS.mac? # or OS.osx? or OS.x?
=> false
Pour quelque chose de facilement accessible dans la plupart des installations Ruby et qui est déjà un peu traité pour vous, je vous recommande ceux-ci :
-
Gem::Platform.local.os
#=> ex. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( code ) -
Gem.win_platform?
#=> ex. vrai, faux ( code )
Ces deux et tous les autres script 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"]
#=> ex. "linux-gnu" (code 1 , 2 ) -
RbConfig::CONFIG["arch"]
#=> par exemple, "i686-linux", "i386-linux-gnu" (transmis en tant que lors de la compilation de l'interpréteur Ruby. ) -
RUBY_PLATFORM
#=> Par exemple, "i386-linux-gnu" et "darwin". Notez que cela renvoie "java" en JRuby ! ( code )- Ce sont toutes des variantes de Windows :
/cygwin|mswin|mingw|bccwin|wince|emx/
- Ce sont toutes des variantes de Windows :
-
RUBY_ENGINE
#=> par exemple, "ruby", "jruby".
Des bibliothèques sont disponibles si la dépendance ne vous dérange pas et si vous voulez quelque chose d'un peu plus convivial. Plus précisément, OS propose des méthodes comme OS.mac?
o OS.posix?
. Plate-forme peut bien faire la distinction entre une variété de plateformes Unix. Platform::IMPL
retournera, par exemple, :linux, :freebsd, :netbsd, :hpux. sys-uname y 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 de système spécifiques, comme les différentes distributions de Linux, voyez ma réponse pour Détecter une distribution Linux en Ruby .
- Réponses précédentes
- Plus de réponses