Tôi muốn chương trình Ruby của mình làm những việc khác trên Mac so với trên Windows. Làm cách nào để biết chương trình của tôi đang chạy trên hệ thống nào?
Tôi muốn chương trình Ruby của mình làm những việc khác trên Mac so với trên Windows. Làm cách nào để biết chương trình của tôi đang chạy trên hệ thống nào?
Câu trả lời:
Sử dụng RUBY_PLATFORM
hằng số và tùy chọn bọc nó trong một mô-đun để làm cho nó thân thiện hơ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
Nó không hoàn hảo, nhưng hoạt động tốt cho các nền tảng mà tôi phát triển và nó đủ dễ dàng để mở rộng.
RbConfig::CONFIG["host_os"]
để có được hệ điều hành của mình.
(Cảnh báo: đọc bình luận của @Peter Wagenet) Tôi thích điều này, hầu hết mọi người sử dụng rubygem , đáng tin cậy của nó, là nền tảng chéo
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"
cập nhật sử dụng kết hợp với "Cập nhật! Bổ sung! Rubygems ngày nay ..." để giảm thiểu khiGem::Platform.local.os == 'java'
Hoặc
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
hoặc là
irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
Config::CONFIG[‘host_os’]
không?
RbConfig::CONFIG["arch"]
irb(main):002:0> require 'rbconfig' => false
(irb):10:in
irb_binding ': Sử dụng RbConfig thay vì Cấu hình lỗi thời và không được dùng nữa.' Vì vậy, tôi đã sử dụng nó RbConfig::CONFIG.each
và liệt kê tất cả các giá trị khác nhau. Có thể bạn có thể tìm thấy một cái gì đó trong đó để giúp bạn tìm thấy những gì bạn đang tìm kiếm.
Tôi có câu trả lời thứ hai, để thêm nhiều lựa chọn hơn cho cuộc chiến. Hệ điều hành rubygem và trang github của họ có danh sách các dự án liên quan.
yêu cầu 'hệ điều hành' >> OS.windows? => true # hay OS.doze? >> OS.bits => 32 >> OS.java? => true # nếu bạn đang chạy trong jruby. Ngoài ra OS.jruby? >> OS.ruby_bin => "c: \ ruby18 \ bin \ ruby.exe" # hoặc "/ usr / local / bin / ruby" hoặc không >> OS.posix? => false # true cho linux, os x, cygwin >> OS.mac? # hoặc OS.osx? hoặc OS.x? => sai
Hãy thử đá quý 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']
... + không cần phải bao gồmConfig
include
hoặc cả hai loại Mô-đun, và đây là câu trả lời tốt nhất IMO. Lưu ý cách anh ta include
sử dụng Mô-đun, vì vậy không cần RbConfig hoặc Cấu hình.
Cập nhật! Thêm vào! Rubygems ngày nay giao hàng với Gem.win_platform?
.
Ví dụ về cách sử dụng trong kho Rubygems và cái này, để rõ ràng:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Chúng tôi đã làm khá tốt cho đến nay với đoạn mã sau
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
Để có thứ gì đó có thể truy cập dễ dàng trong hầu hết các bản cài đặt Ruby đã được xử lý phần nào cho bạn, tôi khuyên bạn nên:
Gem::Platform.local.os
# => ví dụ: "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( mã )Gem.win_platform?
# => ví dụ: true, false ( mã )Cả hai tập lệnh này và mọi tập lệnh kiểm tra nền tảng khác mà tôi biết đều dựa trên việc diễn giải các biến cơ bản sau:
RbConfig::CONFIG["host_os"]
# => ví dụ: "linux-gnu" (mã 1 , 2 )RbConfig::CONFIG["arch"]
# => ví dụ: "i686-linux", "i386-linux-gnu" (được truyền dưới dạng tham số khi trình thông dịch Ruby được biên dịch )RUBY_PLATFORM
# => ví dụ: "i386-linux-gnu", "darwin" - Lưu ý rằng điều này trả về "java" trong JRuby! ( mã )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => ví dụ: "ruby", "jruby"Các thư viện có sẵn nếu bạn không ngại sự phụ thuộc và muốn thứ gì đó thân thiện hơn với người dùng. Cụ thể, hệ điều hành cung cấp các phương thức như OS.mac?
hoặc OS.posix?
. Nền tảng có thể phân biệt tốt giữa nhiều nền tảng Unix. Platform::IMPL
sẽ trở lại, ví dụ. : linux,: freebsd,: netbsd,: hpux. sys-uname và sysinfo cũng tương tự. useinfo cực kỳ cơ bản và sẽ không thành công trên bất kỳ hệ thống nào ngoài Windows, Mac và Linux.
Nếu bạn muốn có các thư viện nâng cao hơn với các chi tiết hệ thống cụ thể, chẳng hạn như các bản phân phối Linux khác nhau, hãy xem câu trả lời của tôi cho Phát hiện bản phân phối Linux trong Ruby .
RUBY_PLATFORM
hoặc RbConfig::CONFIG["host_os"]
được điền. Nhìn vào mã, nó vẫn không rõ ràng với tôi.
Khi tôi chỉ cần biết đó là hệ điều hành giống Windows hay Unix thì thường là đủ
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Tốt nhất bạn nên gõ nền tảng giống như phát triển trong Ruby. Nhưng nếu bạn phải biết liệu nền tảng đó có phải là Windows hay không, hãy đặt câu hỏi thay vì cố gắng suy luận.