web-dev-qa-db-fra.com

Comment puis-je trouver sur quel système d'exploitation mon programme Ruby fonctionne)?

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?

81
Huluk

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.

133
Aaron Hinni

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

22
jtzero

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"
16
Vinko Vrsalovic

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 
8
jtzero

Essayez la gemme Launchy (gem install launchy):

require 'launchy'
Launchy::Application.new.Host_os_family # => :windows, :darwin, :nix, or :cygwin 
6
Ryan McGeary

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
4
olleolleolle
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
4
pisaruk

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
1
adamliesko

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:

  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 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" (transmis sous la forme paramètre lorsque l'interpréteur Ruby est compilé )
  3. Ruby_PLATFORM # => par exemple. "i386-linux-gnu", "darwin" - Notez que cela renvoie "Java" dans JRuby ! ( code )
    • Ce sont toutes des variantes de Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. 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 .

0
sondra.kinsey