I want my Ruby program to do different things on a Mac than on Windows. How can I find out on which system my program is running?
问题:
回答1:
Use the RUBY_PLATFORM
constant, and optionally wrap it in a module to make it more friendly:
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
It is not perfect, but works well for the platforms that I do development on, and it's easy enough to extend.
回答2:
(Warning: read @Peter Wagenet's comment ) I like this, most people use rubygems, its reliable, is cross 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 use in conjunction with "Update! Addition! Rubygems nowadays..." to mitigate when Gem::Platform.local.os == 'java'
回答3:
Either
irb(main):002:0> require 'rbconfig'
=> true
irb(main):003:0> Config::CONFIG["arch"]
=> "i686-linux"
or
irb(main):004:0> RUBY_PLATFORM
=> "i686-linux"
回答4:
Try the Launchy gem (gem install launchy
):
require 'launchy'
Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
回答5:
I have a second answer, to add more options to the fray. The os rubygem, and the github page has a related projects list.
require 'os' >> OS.windows? => true # or OS.doze? >> OS.bits => 32 >> OS.java? => true # if you're running in jruby. Also OS.jruby? >> OS.ruby_bin => "c:\ruby18\bin\ruby.exe" # or "/usr/local/bin/ruby" or what not >> OS.posix? => false # true for linux, os x, cygwin >> OS.mac? # or OS.osx? or OS.x? => false
回答6:
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
回答7:
Update! Addition! Rubygems nowadays ships with Gem.win_platform?
.
Example usages in the Rubygems repo, and this one, for clarity:
def self.ant_script
Gem.win_platform? ? 'ant.bat' : 'ant'
end
回答8:
We have been doing pretty good so far with the following code
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
回答9:
When I just need to know if it is a Windows or Unix-like OS it is often enough to
is_unix = is_win = false
File::SEPARATOR == '/' ? is_unix = true : is_win = true