ฉันจะค้นหาระบบปฏิบัติการใดที่โปรแกรม Ruby ของฉันทำงานอยู่ได้อย่างไร


89

ฉันต้องการให้โปรแกรม Ruby ของฉันทำสิ่งต่างๆบนเครื่อง Mac มากกว่าบน Windows ฉันจะทราบได้อย่างไรว่าโปรแกรมของฉันกำลังทำงานอยู่ในระบบใด


คำตอบ:


143

ใช้RUBY_PLATFORMค่าคงที่และเลือกรวมไว้ในโมดูลเพื่อให้เป็นมิตรมากขึ้น:

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

มันไม่สมบูรณ์แบบ แต่ใช้งานได้ดีกับแพลตฟอร์มที่ฉันพัฒนาและมันง่ายพอที่จะขยาย


8
สำหรับ jruby คุณควรใช้RbConfig::CONFIG["host_os"]ระบบปฏิบัติการของคุณดีกว่า
FilBot3

2
มีที่ไหนบ้างที่สิ่งนี้บรรจุลงในอัญมณีที่สามารถใช้แทนการคัดลอก / วางหรือเช่นนั้นได้? ถ้ามีที่ไหน :)
ลินเดส

1
ฉันชอบสิ่งนี้มากกว่าอัญมณีใด ๆ
C Johnson

มีวิธีใดบ้างที่ฉันสามารถตรวจสอบเวอร์ชันเฉพาะของ Windows เช่น Windows 8.1
Sajid

regex ตัวแปรของ windows นั้นปิด btw แต่ละชื่อควรอยู่ในวงเล็บสำหรับ "|" หรือทำงานตามที่คาดไว้
Epigene

24

(คำเตือน: อ่านความคิดเห็นของ @Peter Wagenet) ฉันชอบสิ่งนี้คนส่วนใหญ่ใช้ทับทิมที่เชื่อถือได้คือข้ามแพลตฟอร์ม

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"

updateใช้ร่วมกับ"Update! Addition! Rubygems today ... "เพื่อลดเวลาGem::Platform.local.os == 'java'


4
ใน jruby รายงานเพียงว่า "java" ดังนั้นจึงไม่เพียงพอหากคุณคาดหวังว่าจะมีใครใช้งาน jruby
Peter Wagenet

17

ทั้ง

irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"

หรือ

irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"

1
คุณไม่ได้หมายถึงConfig::CONFIG[‘host_os’]?
Andrew Grimm

5
"ใช้ RbConfig แทน Config ที่ล้าสมัยและเลิกใช้แล้ว" =>RbConfig::CONFIG["arch"]
jtzero

1
@jtzero หากคุณให้คำตอบที่สมบูรณ์ยิ่งขึ้นในความคิดเห็นฉันจะอัปเดตคำตอบที่เขียนในปี 2008
Vinko Vrsalovic

ในทับทิม 1.9.3 (p327) เป็นเพียงเส้นนั้นทับทิมมีโดยค่าเริ่มต้นirb(main):002:0> require 'rbconfig' => false
jtzero

เมื่อฉันทำเช่นนั้นฉันได้รับคำสั่งว่าเป็นค่าเสื่อมราคา (irb):10:in irb_binding ': ใช้ RbConfig แทน Config ที่ล้าสมัยและเลิกใช้แล้ว `ดังนั้นฉันจึงใช้สิ่งนั้นRbConfig::CONFIG.eachและแสดงรายการค่าที่แตกต่างกันทั้งหมด บางทีคุณอาจพบบางอย่างในนั้นเพื่อช่วยให้คุณพบสิ่งที่คุณกำลังมองหา
FilBot3

10

ฉันมีคำตอบที่สองเพื่อเพิ่มตัวเลือกเพิ่มเติมในการต่อสู้ os rubygemและหน้า githubมีรายการโปรเจ็กต์ที่เกี่ยวข้อง

ต้องการ 'os'

>> OS.windows?
=> จริง # หรือ OS.doze?

>> OS.bits
=> 32

>> OS.java?
=> จริง # ถ้าคุณกำลังทำงานใน jruby OS.jruby ด้วย?

>> OS.ruby_bin
=> "c: \ ruby18 \ bin \ ruby.exe" # หรือ "/ usr / local / bin / ruby" หรืออะไร

>> OS.posix?
=> false # true สำหรับ linux, os x, cygwin

>> OS.mac? # หรือ OS.osx? หรือ OS.x?
=> เท็จ


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

ฉันเดาว่าน่าจะเป็นcase Config::CONFIG['host_os']?
เทียบเท่า 8

จริงๆแล้วในทับทิม 2 ควรเป็นRbConfig::Obsolete::CONFIG['host_os'] ... + ไม่จำเป็นต้องรวมConfig
เทียบเท่า 8

เปลี่ยนincludeโมดูลหรือทั้งสองประเภทจากนั้นนี่คือคำตอบที่ดีที่สุด IMO สังเกตว่าเขาincludeใช้โมดูลอย่างไรจึงไม่จำเป็นต้องใช้ RbConfig หรือ Config
FilBot3


2

จนถึงตอนนี้เราทำได้ดีมากด้วยรหัสต่อไปนี้

  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

สำหรับสิ่งที่สามารถเข้าถึงได้ง่ายในการติดตั้ง Ruby ส่วนใหญ่ที่ประมวลผลแล้วสำหรับคุณขอแนะนำสิ่งเหล่านี้:

  1. Gem::Platform.local.os# => เช่น. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( รหัส )
  2. Gem.win_platform?# => เช่น. จริงเท็จ ( รหัส )

สคริปต์การตรวจสอบทั้งสองแพลตฟอร์มเหล่านี้และแพลตฟอร์มอื่น ๆ ที่ฉันรู้ขึ้นอยู่กับการตีความตัวแปรพื้นฐานเหล่านี้:

  1. RbConfig::CONFIG["host_os"]# => เช่น. "linux-gnu" (รหัส1 , 2 )
  2. RbConfig::CONFIG["arch"]# => เช่น. "i686-linux", "i386-linux-gnu" (ส่งผ่านเป็นพารามิเตอร์เมื่อคอมไพล์ตัวแปล Ruby )
  3. RUBY_PLATFORM# => เช่น. "i386-linux-gnu", "darwin" - โปรดทราบว่าสิ่งนี้ส่งคืน "java" ใน JRuby! ( รหัส )
    • นี่คือตัวแปรของ Windows ทั้งหมด: /cygwin|mswin|mingw|bccwin|wince|emx/
  4. RUBY_ENGINE# => เช่น. "ทับทิม", "jruby"

มีห้องสมุดให้ใช้งานหากคุณไม่คำนึงถึงการพึ่งพาและต้องการบางสิ่งที่เป็นมิตรกับผู้ใช้มากขึ้น โดยเฉพาะระบบปฏิบัติการวิธีการข้อเสนอเช่นหรือOS.mac? แพลตฟอร์มสามารถแยกแยะได้ดีระหว่างแพลตฟอร์ม Unix ที่หลากหลาย จะกลับมาเช่น : linux,: freebsd,: netbsd,: hpux. sys-unameและsysinfoนั้นคล้ายกัน utilinfoเป็นพื้นฐานอย่างยิ่งและจะล้มเหลวในระบบใด ๆ ที่นอกเหนือจาก Windows, Mac และ LinuxOS.posix?Platform::IMPL

หากคุณต้องการห้องสมุดที่ทันสมัยมากขึ้นกับรายละเอียดของระบบที่เฉพาะเจาะจงเช่นลินุกซ์ที่แตกต่างกันให้ดูคำตอบของฉันสำหรับการกระจายการตรวจจับลินุกซ์ในรูบี


ฉันยินดีให้คำอธิบายหรือลิงก์ที่ชัดเจนยิ่งขึ้นเกี่ยวกับวิธีการRUBY_PLATFORMหรือRbConfig::CONFIG["host_os"]จำนวนข้อมูล ดูรหัสก็ยังไม่ชัดเจนสำหรับฉัน
sondra.kinsey

-6

เมื่อฉันต้องการทราบว่าเป็นระบบปฏิบัติการ Windows หรือ Unix ก็มักจะเพียงพอ

is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true

1
ไฟล์ :: SEPARATOR ให้ / ใน windows ดังนั้นสิ่งนี้จึงไม่ทำงาน
เตอร์

3
ปฏิบัติไม่ดีทุกรอบ File::SEPARATORหากคุณต้องการที่จะรู้ว่าสิ่งที่แยกไฟล์มีการใช้ เป็นการดีที่สุดที่จะพิมพ์แพลตฟอร์มเช่นเดียวกับการพัฒนาใน Ruby แต่ถ้าคุณต้องรู้ว่าแพลตฟอร์มนั้นเป็น Windows หรือไม่ให้ถามคำถามแทนที่จะพยายามสรุป
Robin Daugherty
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.