Saya ingin program Ruby saya melakukan hal yang berbeda di Mac daripada di Windows. Bagaimana cara mengetahui sistem mana yang menjalankan program saya?
ruby
operating-system
Andrew Marshall
sumber
sumber
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.
sumber
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 kapan
Gem::Platform.local.os == 'java'
sumber
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"
sumber
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.
sumber
Coba permata Launchy (
gem install launchy
):require 'launchy' Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
sumber
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
sumber
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 diainclude
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
sumber
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
sumber
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?
atauOS.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 .
sumber
RUBY_PLATFORM
atauRbConfig::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
sumber
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.