Quiero que mi programa Ruby haga cosas diferentes en una Mac que en Windows. ¿Cómo puedo saber en qué sistema se está ejecutando mi programa?
Quiero que mi programa Ruby haga cosas diferentes en una Mac que en Windows. ¿Cómo puedo saber en qué sistema se está ejecutando mi programa?
Respuestas:
Use la RUBY_PLATFORM
constante y, opcionalmente, envuélvala 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
def OS.jruby?
RUBY_ENGINE == 'jruby'
end
end
No es perfecto, pero funciona bien para las plataformas en las que desarrollo y es bastante fácil de ampliar.
RbConfig::CONFIG["host_os"]
para obtener su sistema operativo.
(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"
actualizar el uso junto con "Actualizar! Adición! Rubygems hoy en día ..." para mitigar cuandoGem::Platform.local.os == 'java'
Ya sea
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"
Config::CONFIG[‘host_os’]
?
RbConfig::CONFIG["arch"]
irb(main):002:0> require 'rbconfig' => false
(irb):10:in
irb_binding ': Use RbConfig en lugar de Config obsoleta y obsoleta.' Así que usé eso, RbConfig::CONFIG.each
y enumeré todos los valores diferentes. Quizás puedas encontrar algo allí que te ayude a encontrar lo que estás buscando.
Tengo una segunda respuesta, para agregar más opciones a la refriega. El os rubygem y su página de github tienen una lista de proyectos relacionados.
requiere 'os' >> OS.windows? => verdadero # o OS.doze? >> OS.bits => 32 >> OS.java? => verdadero # si está ejecutando en jruby. ¿También OS.jruby? >> OS.ruby_bin => "c: \ ruby18 \ bin \ ruby.exe" # o "/ usr / local / bin / ruby" o lo que no >> OS.posix? => falso # verdadero para linux, os x, cygwin >> OS.mac? # o OS.osx? o OS.x? => falso
Prueba la gema Launchy ( gem install launchy
):
require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
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
case Config::CONFIG['host_os']
?
RbConfig::Obsolete::CONFIG['host_os']
... + no es necesario incluir elConfig
include
tipos de módulos o ambos, y esta es la mejor respuesta en mi opinión. Fíjese en cómo estaba include
el módulo, por lo que no es necesario RbConfig o Config.
¡Actualizar! ¡Adición! Actualmente, Rubygems se envía con Gem.win_platform?
.
Ejemplos de usos en el repositorio de Rubygems , y este, para mayor claridad:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Lo 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
Para algo fácilmente accesible en la mayoría de las instalaciones de Ruby que ya está algo procesado para usted, le recomiendo lo siguiente:
Gem::Platform.local.os
# => p. ej. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( código )Gem.win_platform?
# => p. ej. verdadero, falso ( código )Tanto estos como todos los demás scripts de verificación de plataformas que conozco se basan en la interpretación de estas variables subyacentes:
RbConfig::CONFIG["host_os"]
# => p. ej. "linux-gnu" (código 1 , 2 )RbConfig::CONFIG["arch"]
# => p. ej. "i686-linux", "i386-linux-gnu" (se pasa como parámetro cuando se compila el intérprete de Ruby )RUBY_PLATFORM
# => p. ej. "i386-linux-gnu", "darwin" - ¡ Tenga en cuenta que esto devuelve "java" en JRuby! ( codigo )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => p. ej. "ruby", "jruby"Las bibliotecas están disponibles si no le importa la dependencia y desea algo un poco más fácil de usar. Específicamente, OS ofrece métodos como OS.mac?
o OS.posix?
. La plataforma puede distinguir bien entre una variedad de plataformas Unix. Platform::IMPL
volverá, por ejemplo. : linux,: freebsd,: netbsd,: hpux. sys-uname y sysinfo son similares. utilinfo es extremadamente básico y fallará en cualquier sistema más allá de Windows, Mac y Linux.
Si desea bibliotecas más avanzadas con detalles específicos del sistema, como diferentes distribuciones de Linux, consulte mi respuesta para Detectar la distribución de Linux en Ruby .
RUBY_PLATFORM
o RbConfig::CONFIG["host_os"]
están pobladas. Mirando el código, todavía no me queda claro.
Cuando solo necesito saber si es un sistema operativo Windows o similar a Unix, a menudo es suficiente
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Es mejor escribir pato en la plataforma como se desarrolla en Ruby. Pero si tiene que saber si la plataforma es Windows, haga la pregunta en lugar de intentar inferirla.