Quero que meu programa Ruby faça coisas diferentes em um Mac do que no Windows. Como posso descobrir em qual sistema meu programa está sendo executado?
Quero que meu programa Ruby faça coisas diferentes em um Mac do que no Windows. Como posso descobrir em qual sistema meu programa está sendo executado?
Respostas:
Use a RUBY_PLATFORM
constante e, opcionalmente, envolva-a em um módulo para torná-la mais amigável:
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
Não é perfeito, mas funciona bem para as plataformas em que desenvolvo e é fácil de estender.
RbConfig::CONFIG["host_os"]
para obter seu sistema operacional.
(Aviso: leia o comentário de @Peter Wagenet) Eu gosto disso, a maioria das pessoas usa rubygems , é confiável, é 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"
atualizar o uso em conjunto com "Atualizar! Adição! Rubygems hoje em dia ..." para mitigar quandoGem::Platform.local.os == 'java'
Ou
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
ou
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 em vez de Config obsoleto e obsoleto. Então, usei isso RbConfig::CONFIG.each
e listei todos os valores diferentes. Talvez você possa encontrar algo lá para ajudá-lo a encontrar o que procura.
Eu tenho uma segunda resposta, para adicionar mais opções à briga. O os rubygem e sua página no github têm uma lista de projetos relacionados.
requer 'os' >> OS.windows? => true # ou OS.doze? >> OS.bits => 32 >> OS.java? => true # se você estiver executando em jruby. Também OS.jruby? >> OS.ruby_bin => "c: \ ruby18 \ bin \ ruby.exe" # ou "/ usr / local / bin / ruby" ou o que não >> OS.posix? => false # true para linux, os x, cygwin >> OS.mac? # ou OS.osx? ou OS.x? => falso
Experimente a joia 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']
... + não há necessidade de incluir oConfig
include
ou ambos os tipos de Módulos, e então esta é a melhor resposta IMO. Observe como ele include
instalou o Módulo, portanto, não há necessidade de RbConfig ou Config.
Atualizar! Adição! Hoje em dia, o Rubygems vem com Gem.win_platform?
.
Exemplos de uso no repositório Rubygems , e este, para maior clareza:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Estamos indo muito bem até agora com o seguinte 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 prontamente acessível na maioria das instalações Ruby que já foi processado de alguma forma para você, eu recomendo estes:
Gem::Platform.local.os
# => por exemplo. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( código )Gem.win_platform?
# => por exemplo. verdadeiro, falso ( código )Esses e todos os outros scripts de verificação de plataforma que conheço se baseiam na interpretação dessas variáveis subjacentes:
RbConfig::CONFIG["host_os"]
# => por exemplo. "linux-gnu" (código 1 , 2 )RbConfig::CONFIG["arch"]
# => por exemplo. "i686-linux", "i386-linux-gnu" (passado como parâmetro quando o interpretador Ruby é compilado )RUBY_PLATFORM
# => por exemplo. "i386-linux-gnu", "darwin" - Observe que retorna "java" em JRuby! ( código )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => por exemplo. "ruby", "jruby"Bibliotecas estão disponíveis se você não se importar com a dependência e quiser algo um pouco mais amigável. Especificamente, o sistema operacional oferece métodos como OS.mac?
ou OS.posix?
. A plataforma pode distinguir bem entre uma variedade de plataformas Unix. Platform::IMPL
retornará, por exemplo. : linux,: freebsd,: netbsd,: hpux. sys-uname e sysinfo são semelhantes. utilinfo é extremamente básico e falhará em qualquer sistema além do Windows, Mac e Linux.
Se você quiser bibliotecas mais avançadas com detalhes específicos do sistema, como diferentes distribuições Linux, veja minha resposta para Detectar distribuição Linux em Ruby .
RUBY_PLATFORM
ou RbConfig::CONFIG["host_os"]
são preenchidos. Olhando para o código, ainda não está claro para mim.
Quando eu só preciso saber se é um sistema operacional Windows ou Unix, muitas vezes basta
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. É melhor digitar a plataforma como se fosse desenvolver em Ruby. Mas se você precisa saber se a plataforma é Windows, faça a pergunta em vez de tentar inferir.