Je veux que mon programme Ruby fasse différentes choses sur un Mac que sur Windows. Comment puis-je savoir sur quel système mon programme fonctionne?
Utilisez le Ruby_PLATFORM
constant, 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
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.
(Attention: lire le commentaire de @Peter Wagenet) J'aime ça, la plupart des gens utilisent rubygems , c'est fiable, c'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 conjointement avec "Mettre à jour! Addition! Rubygems de nos jours ..." pour atténuer les cas où Gem::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"
J'ai une deuxième réponse, pour ajouter plus d'options à la mêlée. L'os rubygem , et leur page github a une liste de projets associés.
nécessite '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 quoi >> OS.posix? => false # true pour linux, os x, cygwin >> OS .Mac? # ou OS.osx? ou OS.x? => false
Essayez la gemme Launchy (gem install launchy
):
require 'launchy'
Launchy::Application.new.Host_os_family # => :windows, :darwin, :nix, or :cygwin
Mise à jour! Addition! Rubygems est actuellement livré avec Gem.win_platform?
.
Exemples d'utilisations dans le dépôt Rubygems , et celui-ci, pour plus de clarté:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
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
Nous avons fait assez bien jusqu'à présent 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 de Ruby qui est déjà quelque peu traité pour vous, je recommande celles-ci:
Gem::Platform.local.os
# => par exemple. "mingw32", "Java", "linux", "cygwin", "aix", "dalvik" ( code )Gem.win_platform?
# => par exemple. vrai, faux ( code )Ces deux 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" (transmis sous la forme paramètre lorsque l'interpréteur Ruby est compilé )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 cela 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?
. Platform peut bien distinguer une variété de plateformes Unix. Platform::IMPL
reviendra, par exemple. : linux,: freebsd,: netbsd,: hpux. sys-uname et sysinfo sont similaires. tilinfo est extrêmement basique et échouera sur tous les systèmes au-delà de 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, voyez ma réponse pour Détection de la distribution Linux dans Ruby .