Saya ingin program Ruby saya melakukan hal yang berbeda di Mac daripada di Windows. Bagaimana cara mengetahui sistem mana yang menjalankan program saya?
Saya ingin program Ruby saya melakukan hal yang berbeda di Mac daripada di Windows. Bagaimana cara mengetahui sistem mana yang menjalankan program saya?
Jawaban:
Gunakan RUBY_PLATFORM
konstanta, dan secara opsional bungkus dalam sebuah modul agar lebih bersahabat:
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
Ini tidak sempurna, tetapi berfungsi dengan baik untuk platform tempat saya melakukan pengembangan, dan cukup mudah untuk diperluas.
RbConfig::CONFIG["host_os"]
OS Anda.
(Peringatan: baca komentar @Peter Wagenet) Saya suka ini, kebanyakan orang menggunakan rubygems , andal, lintas 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"
update digunakan bersama dengan "Perbarui! Penambahan! Rubygems saat ini ..." untuk mengurangi kapanGem::Platform.local.os == 'java'
Antara
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
atau
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 ': Gunakan RbConfig daripada Config.` Jadi saya menggunakan itu, RbConfig::CONFIG.each
dan mendaftar semua nilai yang berbeda. Mungkin Anda dapat menemukan sesuatu di sana untuk membantu Anda menemukan apa yang Anda cari.
Saya punya jawaban kedua, untuk menambahkan lebih banyak opsi. Os rubygem , dan halaman github mereka memiliki daftar proyek terkait.
membutuhkan 'os' >> OS.windows? => true # atau OS.doze? >> OS.bits => 32 >> OS.java? => true # jika Anda menjalankan jruby. Juga OS.jruby? >> OS.ruby_bin => "c: \ ruby18 \ bin \ ruby.exe" # atau "/ usr / local / bin / ruby" atau yang tidak >> OS.posix? => false # true untuk linux, os x, cygwin >> OS.mac? # atau OS.osx? atau OS.x? => salah
Coba permata 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']
... + tidak perlu menyertakanConfig
include
atau kedua jenis Modul, dan ini adalah jawaban terbaik IMO. Perhatikan bagaimana dia include
Modul, jadi tidak perlu RbConfig atau Config.
Memperbarui! Tambahan! Rubygems saat ini dikirimkan dengan Gem.win_platform?
.
Contoh penggunaan di repo Rubygems , dan yang ini, untuk kejelasan:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
Kami telah melakukan cukup baik sejauh ini dengan kode berikut
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
Untuk sesuatu yang mudah diakses di sebagian besar instalasi Ruby yang sudah diproses untuk Anda, saya merekomendasikan ini:
Gem::Platform.local.os
# => mis. "mingw32", "java", "linux", "cygwin", "aix", "dalvik" ( kode )Gem.win_platform?
# => mis. benar, salah ( kode )Baik ini dan setiap skrip pemeriksaan platform lainnya yang saya tahu didasarkan pada interpretasi variabel yang mendasari ini:
RbConfig::CONFIG["host_os"]
# => mis. "linux-gnu" (kode 1 , 2 )RbConfig::CONFIG["arch"]
# => mis. "i686-linux", "i386-linux-gnu" (diteruskan sebagai parameter saat interpreter Ruby dikompilasi )RUBY_PLATFORM
# => mis. "i386-linux-gnu", "darwin" - Perhatikan bahwa ini mengembalikan "java" di JRuby! ( kode )
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
# => mis. "ruby", "jruby"Perpustakaan tersedia jika Anda tidak keberatan dengan ketergantungan tersebut dan menginginkan sesuatu yang sedikit lebih ramah pengguna. Secara khusus, OS menawarkan metode seperti OS.mac?
atau OS.posix?
. Platform dapat membedakan dengan baik antara berbagai platform Unix. Platform::IMPL
akan kembali, mis. : linux,: freebsd,: netbsd,: hpux. sys-uname dan sysinfo serupa. utilinfo sangat mendasar, dan akan gagal pada sistem apa pun selain Windows, Mac, dan Linux.
Jika Anda menginginkan pustaka yang lebih canggih dengan detail sistem tertentu, seperti distribusi Linux yang berbeda, lihat jawaban saya untuk Mendeteksi distribusi Linux di Ruby .
RUBY_PLATFORM
atau RbConfig::CONFIG["host_os"]
diisi. Melihat kodenya, masih belum jelas bagi saya.
Ketika saya hanya ingin tahu apakah itu Windows atau OS mirip Unix, itu sudah cukup
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true
File::SEPARATOR
. Yang terbaik adalah menghindari platform seperti mengembangkan di Ruby. Tetapi jika Anda harus tahu apakah platform tersebut adalah Windows, ajukan pertanyaan daripada mencoba menyimpulkannya.