Ruby programımın hangi işletim sisteminde çalıştığını nasıl bulabilirim?


Yanıtlar:


143

RUBY_PLATFORMSabiti 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.


8
jruby RbConfig::CONFIG["host_os"]için işletim sisteminizi kullanmakta daha iyi olursunuz.
FilBot3

2
Kopyalama / yapıştırma veya benzeri bir şey yerine böyle bir şeyin bir mücevher olarak paketlendiği, kullanılabileceği bir yer var mı? Öyleyse nerede? :)
lindes

1
Bunu herhangi bir mücevher yerine tercih ederim.
C Johnson

Windows 8.1 gibi belirli bir Windows sürümünü kontrol etmemin bir yolu var mı?
Sajid

Windows varyant normal ifadesinin btw dışında olduğunu, her adın "|" için parantez içinde olması gerekir. veya beklendiği gibi çalışmak.
Epigene

24

(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'


4
Jruby'de sadece "java" olduğunu bildirir, bu nedenle herhangi birinin jruby çalıştırmasını bekliyorsanız yeterli değildir.
Peter Wagenet

17

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"

1
Değil mi Config::CONFIG[‘host_os’]?
Andrew Grimm

5
"Eski ve kullanımdan kaldırılan Config yerine RbConfig kullanın" =>RbConfig::CONFIG["arch"]
jtzero

1
@jtzero Yorumlarda daha eksiksiz bir cevap verirseniz, 2008'de yazılan cevabı güncelleyeceğim
Vinko Vrsalovic

Ruby 1.9.3'te (p327) tam da bu çizgidir, Ruby'de varsayılan olarak vardırirb(main):002:0> require 'rbconfig' => false
jtzero

Bunu yaptığımda, amortismana tabi tutulduğunu belirten bir açıklama aldım. (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.eachve tüm farklı değerleri listeledim. Belki orada aradığınızı bulmanıza yardımcı olacak bir şeyler bulabilirsiniz.
FilBot3

10

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ış


4
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

Sanırım bu olmalı case Config::CONFIG['host_os']?
equivalent8

aslında Ruby 2'de olması gereken RbConfig::Obsolete::CONFIG['host_os'] ... +Config
eşdeğerini

includeModül türlerini veya her ikisini de değiştirin ve sonra bu en iyi yanıt IMO'dur. includeModülü nasıl kullandığına dikkat edin , bu nedenle RbConfig veya Config'e gerek yok.
FilBot3


2

Ş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

1

Çoğu Ruby kurulumunda kolayca erişilebilen ve zaten sizin için işlenmiş bir şey için şunları tavsiye ederim:

  1. Gem::Platform.local.os# => ör. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( kod )
  2. 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:

  1. RbConfig::CONFIG["host_os"]# => ör. "linux-gnu" (kod 1 , 2 )
  2. RbConfig::CONFIG["arch"]# => ör. "i686-linux", "i386-linux-gnu" ( Ruby yorumlayıcısı derlendiğinde parametre olarak geçer )
  3. RUBY_PLATFORM# => ör. "i386-linux-gnu", "darwin" - Bunun JRuby'de "java" döndürdüğüne dikkat edin! ( kod )
    • Bunların tümü Windows varyantlarıdır: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. 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::IMPLdö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 .


Nasıl RUBY_PLATFORMveya 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.
sondra.kinsey

-6

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

1
Dosya :: SEPARATOR pencerelere / pencerelerde veriyor, bu yüzden bu işe yaramıyor
Peter

3
Her yerde kötü idman. Dosya ayırıcısının ne olduğunu öğrenmek istiyorsanız, kullanın 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.
Robin Daugherty
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.