Come posso sapere su quale sistema operativo è in esecuzione il mio programma Ruby?


Risposte:


143

Usa la RUBY_PLATFORMcostante e opzionalmente racchiudila in un modulo per renderlo più amichevole:

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

Non è perfetto, ma funziona bene per le piattaforme su cui sviluppo ed è abbastanza facile da estendere.


8
per jruby, è meglio usare RbConfig::CONFIG["host_os"]per ottenere il tuo sistema operativo.
FilBot3

2
C'è un posto in cui qualcosa di simile è confezionato in una gemma, che si potrebbe usare, invece di copiare / incollare o simili? In caso affermativo, dove? :)
lindes

1
Lo preferisco a qualsiasi gemma.
C Johnson

Esiste un modo per verificare la presenza di una versione specifica di Windows, ad esempio Windows 8.1?
Sajid

Quella regex della variante di Windows è disattivata btw, ogni nome dovrebbe essere tra parentesi per "|" o per funzionare come previsto.
Epigene

24

(Attenzione: leggi il commento di @Peter Wagenet) Mi piace, la maggior parte delle persone usa rubygems , è affidabile, è multipiattaforma

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"

update usare insieme a "Update! Addition! Rubygems nowadays ..." per mitigare quandoGem::Platform.local.os == 'java'


4
Su jruby riporta solo "java" quindi non è sufficiente se ti aspetti che qualcuno esegua jruby.
Peter Wagenet

17

O

irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"

o

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"

1
Non intendi Config::CONFIG[‘host_os’]?
Andrew Grimm

5
"Usa RbConfig invece di una configurazione obsoleta e deprecata" =>RbConfig::CONFIG["arch"]
jtzero

1
@jtzero Se fornisci una risposta più completa nei commenti aggiorno la risposta scritta nel 2008
Vinko Vrsalovic

in ruby ​​1.9.3 (p327) è proprio quella linea, ruby ​​l'ha per impostazione predefinitairb(main):002:0> require 'rbconfig' => false
jtzero

Quando l'ho fatto, ho ricevuto una dichiarazione che diceva che era stato deprezzato. (irb):10:in irb_binding ': Usa RbConfig invece di una configurazione obsoleta e deprecata. Quindi l'ho usata ed ho RbConfig::CONFIG.eachelencato tutti i diversi valori. Forse puoi trovare qualcosa che ti aiuti a trovare quello che stai cercando.
FilBot3

10

Ho una seconda risposta, per aggiungere più opzioni alla mischia. L'os rubygem e la loro pagina github hanno un elenco di progetti correlati.

richiedono 'os'

>> OS.windows?
=> true # o OS.doze?

>> OS.bits
=> 32

>> OS.java?
=> true # se corri in jruby. Anche OS.jruby?

>> OS.ruby_bin
=> "c: \ ruby18 \ bin \ ruby.exe" # o "/ usr / local / bin / ruby" o cosa no

>> OS.posix?
=> false # true per linux, os x, cygwin

>> OS.mac? # o OS.osx? o OS.x?
=> falso


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

Immagino che dovrebbe essere case Config::CONFIG['host_os']?
equivalente

in realtà in Ruby 2 dovrebbe essere RbConfig::Obsolete::CONFIG['host_os'] ... + alcuna necessità di includere ilConfig
equivalent8

Cambia il includeo entrambi i tipi di moduli, e quindi questa è la migliore risposta IMO. Nota come ha fatto includeil modulo, quindi non c'è bisogno di RbConfig o Config.
FilBot3


2

Finora abbiamo lavorato abbastanza bene con il codice seguente

  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

Per qualcosa di facilmente accessibile nella maggior parte delle installazioni Ruby che è già in qualche modo elaborato per te, ti consiglio questi:

  1. Gem::Platform.local.os# => ad es. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( codice )
  2. Gem.win_platform?# => ad es. vero, falso ( codice )

Sia questi che tutti gli altri script di controllo della piattaforma che conosco si basano sull'interpretazione di queste variabili sottostanti:

  1. RbConfig::CONFIG["host_os"]# => ad es. "linux-gnu" (codice 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => ad es. "i686-linux", "i386-linux-gnu" (passato come parametro quando viene compilato l'interprete Ruby )
  3. RUBY_PLATFORM# => es. "i386-linux-gnu", "darwin" - Nota che questo restituisce "java" in JRuby! ( codice )
    • Queste sono tutte le varianti di Windows: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => ad es. "rubino", "jruby"

Le librerie sono disponibili se non ti dispiace la dipendenza e vuoi qualcosa di un po 'più user-friendly. In particolare, il sistema operativo offre metodi come OS.mac?o OS.posix?. La piattaforma può distinguere bene tra una varietà di piattaforme Unix. Platform::IMPLtornerà, ad es. : linux,: freebsd,: netbsd,: hpux. sys-uname e sysinfo sono simili. utilinfo è estremamente semplice e non funzionerà su tutti i sistemi oltre a Windows, Mac e Linux.

Se desideri librerie più avanzate con dettagli di sistema specifici, come diverse distribuzioni Linux, vedi la mia risposta per Rilevamento della distribuzione Linux in Ruby .


Mi piacerebbe benvenuto spiegazioni più precise o link a come RUBY_PLATFORMo RbConfig::CONFIG["host_os"]sono popolati. Guardando il codice, non mi è ancora chiaro.
sondra.kinsey

-6

Quando ho solo bisogno di sapere se si tratta di un sistema operativo Windows o Unix, spesso è sufficiente

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true

1
File :: SEPARATOR dà / in Windows, quindi questo non funziona
peter

3
Cattive pratiche tutt'intorno. Se vuoi sapere qual è il separatore di file, usa File::SEPARATOR. È meglio digitare la piattaforma in modo anatra come lo sviluppo in Ruby. Ma se devi sapere se la piattaforma è Windows, fai la domanda invece di cercare di dedurla.
Robin Daugherty
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.