ฉันต้องการให้โปรแกรม Ruby ของฉันทำสิ่งต่างๆบนเครื่อง Mac มากกว่าบน Windows ฉันจะทราบได้อย่างไรว่าโปรแกรมของฉันกำลังทำงานอยู่ในระบบใด
ฉันต้องการให้โปรแกรม Ruby ของฉันทำสิ่งต่างๆบนเครื่อง Mac มากกว่าบน Windows ฉันจะทราบได้อย่างไรว่าโปรแกรมของฉันกำลังทำงานอยู่ในระบบใด
คำตอบ:
ใช้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
มันไม่สมบูรณ์แบบ แต่ใช้งานได้ดีกับแพลตฟอร์มที่ฉันพัฒนาและมันง่ายพอที่จะขยาย
RbConfig::CONFIG["host_os"]
ระบบปฏิบัติการของคุณดีกว่า
(คำเตือน: อ่านความคิดเห็นของ @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'
ทั้ง
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
หรือ
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 ': ใช้ RbConfig แทน Config ที่ล้าสมัยและเลิกใช้แล้ว `ดังนั้นฉันจึงใช้สิ่งนั้นRbConfig::CONFIG.each
และแสดงรายการค่าที่แตกต่างกันทั้งหมด บางทีคุณอาจพบบางอย่างในนั้นเพื่อช่วยให้คุณพบสิ่งที่คุณกำลังมองหา
ฉันมีคำตอบที่สองเพื่อเพิ่มตัวเลือกเพิ่มเติมในการต่อสู้ 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? => เท็จ
ลองอัญมณี 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']
... + ไม่จำเป็นต้องรวมConfig
include
โมดูลหรือทั้งสองประเภทจากนั้นนี่คือคำตอบที่ดีที่สุด IMO สังเกตว่าเขาinclude
ใช้โมดูลอย่างไรจึงไม่จำเป็นต้องใช้ RbConfig หรือ Config
อัพเดท! ส่วนที่เพิ่มเข้าไป! ปัจจุบัน Rubygems มาพร้อมกับGem.win_platform?
.
ตัวอย่างการใช้งานใน repo Rubygemsและอันนี้เพื่อความชัดเจน:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
จนถึงตอนนี้เราทำได้ดีมากด้วยรหัสต่อไปนี้
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
สำหรับสิ่งที่สามารถเข้าถึงได้ง่ายในการติดตั้ง Ruby ส่วนใหญ่ที่ประมวลผลแล้วสำหรับคุณขอแนะนำสิ่งเหล่านี้:
Gem::Platform.local.os
# => เช่น. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( รหัส )Gem.win_platform?
# => เช่น. จริงเท็จ ( รหัส )สคริปต์การตรวจสอบทั้งสองแพลตฟอร์มเหล่านี้และแพลตฟอร์มอื่น ๆ ที่ฉันรู้ขึ้นอยู่กับการตีความตัวแปรพื้นฐานเหล่านี้:
RbConfig::CONFIG["host_os"]
# => เช่น. "linux-gnu" (รหัส1 , 2 )RbConfig::CONFIG["arch"]
# => เช่น. "i686-linux", "i386-linux-gnu" (ส่งผ่านเป็นพารามิเตอร์เมื่อคอมไพล์ตัวแปล Ruby )RUBY_PLATFORM
# => เช่น. "i386-linux-gnu", "darwin" - โปรดทราบว่าสิ่งนี้ส่งคืน "java" ใน JRuby! ( รหัส )
/cygwin|mswin|mingw|bccwin|wince|emx/
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"]
จำนวนข้อมูล ดูรหัสก็ยังไม่ชัดเจนสำหรับฉัน
เมื่อฉันต้องการทราบว่าเป็นระบบปฏิบัติการ Windows หรือ Unix ก็มักจะเพียงพอ
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
หากคุณต้องการที่จะรู้ว่าสิ่งที่แยกไฟล์มีการใช้ เป็นการดีที่สุดที่จะพิมพ์แพลตฟอร์มเช่นเดียวกับการพัฒนาใน Ruby แต่ถ้าคุณต้องรู้ว่าแพลตฟอร์มนั้นเป็น Windows หรือไม่ให้ถามคำถามแทนที่จะพยายามสรุป