Comment puis-je trouver sur quel système d'exploitation mon programme Ruby est exécuté?

Réponses:

142

Utilisez la RUBY_PLATFORMconstante 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.

Aaron Hinni
la source
8
pour jruby, il vaut mieux utiliser RbConfig::CONFIG["host_os"]pour obtenir votre système d'exploitation.
FilBot3
2
Y a-t-il un endroit où quelque chose comme ça est emballé dans un bijou, que l'on pourrait utiliser, au lieu de copier / coller ou autre? Si oui, où? :)
lindes
1
Je préfère cela à n'importe quel bijou.
C Johnson
Existe-t-il un moyen de vérifier une version spécifique de Windows, par exemple Windows 8.1?
Sajid le
Cette variante de regex de Windows est désactivée btw, chaque nom doit être entre parenthèses pour "|" ou pour travailler comme prévu.
Epigene
23

(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'

jtzero
la source
4
Sur jruby, il indique simplement "java", donc ce n'est pas suffisant si vous vous attendez à ce que quelqu'un exécute jruby.
Peter Wagenet
17

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"
Vinko Vrsalovic
la source
1
Tu ne veux pas dire Config::CONFIG[‘host_os’]?
Andrew Grimm
5
"Utiliser RbConfig au lieu de Config obsolète et obsolète" =>RbConfig::CONFIG["arch"]
jtzero
1
@jtzero Si vous fournissez une réponse plus complète dans les commentaires, je mets à jour la réponse écrite en 2008
Vinko Vrsalovic
dans ruby ​​1.9.3 (p327) c'est juste cette ligne, ruby ​​l'a par défautirb(main):002:0> require 'rbconfig' => false
jtzero
Quand je l'ai fait, j'ai reçu une déclaration disant qu'elle avait été dépréciée. (irb):10:in irb_binding ': Utilisez RbConfig au lieu de Config obsolète et obsolète.' Alors j'ai utilisé ça, RbConfig::CONFIG.eachet j'ai listé toutes les différentes valeurs. Peut-être pouvez-vous y trouver quelque chose pour vous aider à trouver ce que vous cherchez.
FilBot3
9

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
jtzero
la source
7

Essayez la gemme Launchy ( gem install launchy):

require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
Ryan McGeary
la source
C'est Launchy :: Application.new.host_os_family dans 2.1.0.
fakeleft le
1
FYI - Launchy utilise rbconfig: github.com/copiousfreetime/launchy/blob/master/lib/launchy
...
4
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
Pisaruk
la source
Je suppose que ça devrait être case Config::CONFIG['host_os']?
équivalent8
en fait dans ruby ​​2 ça devrait être RbConfig::Obsolete::CONFIG['host_os'] ... + pas besoin d'inclure leConfig
équivalent8
Changez le includeou les deux types de modules, et alors c'est la meilleure réponse IMO. Remarquez comment il a fait includele module, donc pas besoin de RbConfig ou Config.
FilBot3
2

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
Adamliesko
la source
0

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:

  1. Gem::Platform.local.os# => par exemple. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( code )
  2. 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:

  1. RbConfig::CONFIG["host_os"]# => par exemple. "linux-gnu" (code 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => par exemple. "i686-linux", "i386-linux-gnu" (passé en paramètre lors de la compilation de l'interpréteur Ruby )
  3. RUBY_PLATFORM# => par exemple. "i386-linux-gnu", "darwin" - Notez que cela renvoie "java" dans JRuby! ( code )
    • Ce sont toutes les variantes de Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. 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::IMPLreviendra, 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 .

sondra.kinsey
la source
Je serais heureux d'avoir des explications ou des liens plus précis sur la façon dont RUBY_PLATFORMou RbConfig::CONFIG["host_os"]sont peuplés. En regardant le code, ce n'est toujours pas clair pour moi.
sondra.kinsey
-6

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
dimus
la source
1
File :: SÉPARATEUR donne / dans les fenêtres, donc cela ne fonctionne pas
peter
3
Mauvaise pratique tout autour. Si vous voulez savoir ce qu'est le séparateur de fichiers, utilisez 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.
Robin Daugherty