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?
ruby
operating-system
Andrew Marshall
fuente
fuente
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.
fuente
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 cuando
Gem::Platform.local.os == 'java'
fuente
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"
fuente
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.
fuente
Prueba la gema Launchy (
gem install launchy
):require 'launchy' Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
fuente
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
fuente
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 estabainclude
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
fuente
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
fuente
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?
oOS.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 .
fuente
RUBY_PLATFORM
oRbConfig::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
fuente
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.