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?
ruby
operating-system
Andrew Marshall
fonte
fonte
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.
fonte
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 quando
Gem::Platform.local.os == 'java'
fonte
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"
fonte
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 issoRbConfig::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.
fonte
Experimente a joia Launchy (
gem install launchy
):require 'launchy' Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
fonte
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
fonte
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 eleinclude
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
fonte
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
fonte
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?
ouOS.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 .
fonte
RUBY_PLATFORM
ouRbConfig::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
fonte
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.