Quiero que mi programa Ruby haga cosas diferentes en una Mac que en Windows. ¿Cómo puedo averiguar en qué sistema se está ejecutando mi programa?¿Cómo puedo encontrar en qué sistema operativo se está ejecutando mi programa Ruby?
Respuesta
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"
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.
Un caso en el que no funcionará es si está usando jruby. –
para jruby, es mejor que uses 'RbConfig :: CONFIG [" host_os "]' para obtener tu sistema operativo. – Pred
¿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
Pruebe 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
Supongo que debería ser 'case Config :: CONFIG ['host_os'] ¿? – equivalent8
en realidad en ruby 2 debería ser 'RbConfig :: obsoleto :: CONFIG ['host_os']' ... + no es necesario incluir 'Config' – equivalent8
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
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
File :: SEPARATOR da/en windows, por lo que esto no funciona – peter
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. –
(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'
En jruby solo informa "java", por lo que no es suficiente si espera que alguien ejecute jruby. –
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
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
actualización! ¡Adición! Rubygems hoy en día se envía con Gem.win_platform?
.
Example usages in the Rubygems repo, y éste, para mayor claridad:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
- 1. ¿Cómo puedo saber en qué dispositivos/versiones de sistema operativo se está ejecutando mi aplicación iOS?
- 2. ¿Cómo puede saber mi programa si Delphi se está ejecutando?
- 3. ¿Cómo obtener el sistema operativo en el que se está ejecutando PHP?
- 4. ¿Cómo puede mi programa determinar si se está ejecutando en Windows de 32 o 64 bits?
- 5. ¿Cómo puedo encontrar el sistema operativo actual en Python?
- 6. Python: ¿En qué sistema operativo me estoy ejecutando?
- 7. Diciendo qué proyecto de ruby on rails se está ejecutando
- 8. ¿Qué iniciador se está ejecutando?
- 9. ¿Cómo puede mi programa detectar si se está ejecutando en un dominio en particular?
- 10. El sistema operativo está eliminando el hilo
- 11. ¿Cómo puedo encontrar pérdidas de memoria en mi programa Python?
- 12. ¿Cómo puedo saber en qué directorio se está ejecutando mi aplicación de consola con C#?
- 13. ¿Qué usuario está ejecutando mi aplicación Rails?
- 14. ¿Dónde puedo encontrar la primera versión del sistema operativo Linux?
- 15. ¿Cuál es la mejor manera para que una aplicación WinForms determine exactamente en qué sistema operativo Windows se está ejecutando?
- 16. ¿Cómo interactúa un programa compilado con el sistema operativo?
- 17. ¿Cómo puedo saber bajo qué versión de IIS se está ejecutando mi aplicación Asp.Net?
- 18. Determinar si el programa se está ejecutando en Windows Server
- 19. ¿Cómo puedo obtener el nombre de usuario de la persona que está ejecutando mi programa?
- 20. ¿Cómo puedo saber si mi script de Perl se está ejecutando en Windows?
- 21. ¿Puedo encontrar a qué usuario se está ejecutando el servidor web como en PHP?
- 22. ¿Cómo incluyo diferentes encabezados basados en mi sistema operativo?
- 23. ¿Cómo obtengo el STDOUT de una llamada al sistema ruby () mientras se está ejecutando?
- 24. ¿Cómo puedo determinar cuánta memoria está usando mi programa .NET?
- 25. Cómo determinar el sistema operativo
- 26. Dónde puedo aprender cómo hacer que un programa C++ interactúe con el sistema operativo (Linux)
- 27. ¿Mi programa está completo?
- 28. ¿Se está ejecutando un método al cerrar el programa?
- 29. ¿Cómo puedo determinar si mi proceso se está ejecutando de forma interactiva?
- 30. ¿Evita que las ventanas entren en suspensión cuando mi programa se está ejecutando?
No quiere decir 'config :: config [‘host_os’]'? –
"Usar RbConfig en lugar de Configuración obsoleta y desaprobada" => '' 'RbConfig :: CONFIG [" arch "]' '' – jtzero
@jtzero Si proporciona una respuesta más completa en los comentarios, actualizaré la respuesta escrita en 2008 –