Ruby programımın bir Mac'te Windows'tan farklı şeyler yapmasını istiyorum. Programımın hangi sistemde çalıştığını nasıl öğrenebilirim?
Ruby programımın bir Mac'te Windows'tan farklı şeyler yapmasını istiyorum. Programımın hangi sistemde çalıştığını nasıl öğrenebilirim?
Yanıtlar:
RUBY_PLATFORM
Sabiti kullanın ve isteğe bağlı olarak daha kolay hale getirmek için bir modüle sarın:
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
Mükemmel değil, ancak geliştirme yaptığım platformlar için iyi çalışıyor ve genişletmesi yeterince kolay.
RbConfig::CONFIG["host_os"]
için işletim sisteminizi kullanmakta daha iyi olursunuz.
(Uyarı: @Peter Wagenet'in yorumunu okuyun) Bunu beğendim, çoğu insan rubygems kullanıyor , güvenilir, çapraz platform
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"
Güncelleme ile birlikte kullanılması "Güncelleme! eklenmesi! rubygems bugünlerde ..." ne zaman hafifletmek içinGem::Platform.local.os == 'java'
Ya
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
veya
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 ': Kullanılmayan ve kullanımdan kaldırılan Config yerine RbConfig kullanın. Bu yüzden bunu kullandım RbConfig::CONFIG.each
ve tüm farklı değerleri listeledim. Belki orada aradığınızı bulmanıza yardımcı olacak bir şeyler bulabilirsiniz.
Mücadeleye daha fazla seçenek eklemek için ikinci bir cevabım var. İşletim sistemi rubygem ve github sayfasında ilgili projeler listesi bulunur.
'os' gerektir >> OS.windows? => true # veya OS.doze? >> OS.bits => 32 >> OS.java? => true # eğer jruby koşuyorsanız. Ayrıca OS.jruby? >> OS.ruby_bin => "c: \ ruby18 \ bin \ ruby.exe" # veya "/ usr / local / bin / ruby" veya ne değil >> OS.posix? => false # linux, os x, cygwin için true >> OS.mac? # veya OS.osx? veya OS.x? => yanlış
Launchy gemini deneyin ( 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']
... +Config
include
Modül türlerini veya her ikisini de değiştirin ve sonra bu en iyi yanıt IMO'dur. include
Modülü nasıl kullandığına dikkat edin , bu nedenle RbConfig veya Config'e gerek yok.
Güncelleme! İlave!Rubygems günümüzde Gem.win_platform?
.
Rubygems deposundaki örnek kullanımlar ve netlik açısından bu:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Şu ana kadar aşağıdaki kodla oldukça iyi iş çıkardık
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
Çoğu Ruby kurulumunda kolayca erişilebilen ve zaten sizin için işlenmiş bir şey için şunları tavsiye ederim:
Gem::Platform.local.os
# => ör. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( kod )Gem.win_platform?
# => ör. doğru, yanlış ( kod )Hem bunlar hem de bildiğim diğer tüm platform kontrol komut dosyası, bu temel değişkenleri yorumlamaya dayanıyor:
RbConfig::CONFIG["host_os"]
# => ör. "linux-gnu" (kod 1 , 2 )RbConfig::CONFIG["arch"]
# => ör. "i686-linux", "i386-linux-gnu" ( Ruby yorumlayıcısı derlendiğinde parametre olarak geçer )RUBY_PLATFORM
# => ör. "i386-linux-gnu", "darwin" - Bunun JRuby'de "java" döndürdüğüne dikkat edin! ( kod )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => ör. "yakut", "jruby"Bağımlılığa aldırış etmezseniz ve biraz daha kullanıcı dostu bir şey istiyorsanız kütüphaneler mevcuttur. OS , özellikle OS.mac?
veya gibi yöntemler sunar OS.posix?
. Platform , çeşitli Unix platformları arasında iyi bir ayrım yapabilir. Platform::IMPL
dönecek, örneğin. : linux,: freebsd,: netbsd,: hpux. sys-uname ve sysinfo benzerdir. kullanım bilgisi son derece basittir ve Windows, Mac ve Linux dışındaki tüm sistemlerde başarısız olur.
Farklı Linux dağıtımları gibi belirli sistem ayrıntılarına sahip daha gelişmiş kitaplıklar istiyorsanız , Ruby'de Linux dağıtımını Algılama konusundaki yanıtıma bakın .
RUBY_PLATFORM
veya nasıl RbConfig::CONFIG["host_os"]
doldurulduğuna dair daha kesin açıklamalar veya bağlantılar beklerim . Koda baktığımda hala net değil.
Windows veya Unix benzeri bir işletim sistemi olup olmadığını bilmem gerektiğinde, genellikle
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Ruby'de geliştirdiğiniz gibi platformu örtmek en iyisidir. Ancak platformun Windows olup olmadığını bilmek zorundaysanız, anlamaya çalışmak yerine soruyu sorun.