2008-10-04 21 views

Respuesta

15

De cualquier

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

No quiere decir 'config :: config [‘host_os’]'? –

+3

"Usar RbConfig en lugar de Configuración obsoleta y desaprobada" => '' 'RbConfig :: CONFIG [" arch "]' '' – jtzero

+1

@jtzero Si proporciona una respuesta más completa en los comentarios, actualizaré la respuesta escrita en 2008 –

121

Utilice la RUBY_PLATFORM constante, y, opcionalmente, lo envuelve en un módulo para que sea más amigable:

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 
end 

No es perfecto, pero funciona bien para las plataformas en las que desarrollo, y es bastante fácil de ampliar.

+7

Un caso en el que no funcionará es si está usando jruby. –

+6

para jruby, es mejor que uses 'RbConfig :: CONFIG [" host_os "]' para obtener tu sistema operativo. – Pred

+2

¿Hay algún lugar donde algo como esto se empaqueta en una gema, que se podría usar, en lugar de copiar/pegar o tal? ¿Si es así, donde? :) – lindes

6

Pruebe la gema Launchy (gem install launchy):

require 'launchy' 
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin 
+0

Eso es Launchy :: Application.new.host_os_family en 2.1.0. – fakeleft

+0

FYI - Launchy usa rbconfig: https://github.com/copiousfreetime/launchy/blob/master/lib/launchy/detect/host_os.rb – codecraig

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 
+0

Supongo que debería ser 'case Config :: CONFIG ['host_os'] ¿? – equivalent8

+0

en realidad en ruby ​​2 debería ser 'RbConfig :: obsoleto :: CONFIG ['host_os']' ... + no es necesario incluir 'Config' – equivalent8

+0

Cambiar el' include' o ambos tipos de módulos, y entonces esto es la mejor respuesta IMO. Observe cómo 'incluyó' el Módulo, por lo que no necesita RbConfig o Config. – Pred

-3

Cuando sólo hay que saber si se trata de un sistema operativo Windows o Unix a menudo es suficiente para

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

File :: SEPARATOR da/en windows, por lo que esto no funciona – peter

+2

Mala práctica por todas partes. Si quiere saber cuál es el separador de archivos, use 'File :: SEPARATOR'. Lo mejor es dejar la plataforma como si se desarrollara en Ruby. Pero si debe saber si la plataforma es Windows, haga la pregunta en lugar de intentar inferirla. –

17

(Advertencia: lea el comentario de @Peter Wagenet) Me gusta esto, la mayoría de la gente usa rubygems, es confiable, es multiplataforma

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" 

actualización su uso en conjunción con "Update! Addition! Rubygems nowadays..." para mitigar cuando Gem::Platform.local.os == 'java'

+3

En jruby solo informa "java", por lo que no es suficiente si espera que alguien ejecute jruby. –

6

que tienen una segunda respuesta, añadir más opciones a la carga. The os rubygem, y github page tiene una lista de proyectos relacionados.

 
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 
0

Hemos estado haciendo bastante bien hasta ahora con el siguiente código

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 
Cuestiones relacionadas