我希望我的Ruby程序在Mac上和Windows上做不同的事情。如何找出我的程序在哪个系统上运行?
Answers:
使用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"]
OS。
(警告:请阅读@Peter Wagenet的评论)我喜欢这样,大多数人使用rubygems,它可靠,是跨平台的
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"
更新会同使用“更新!加成!RubyGems的今天......”,以减轻当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? => true#或OS.doze? >> OS.bits => 32 >> OS.java? => true#如果您在jruby中运行。还有OS.jruby吗? >> OS.ruby_bin =>“ c:\ ruby18 \ bin \ ruby.exe”#或“ / usr / local / bin / ruby”或其他 >> OS.posix? => false#对于linux,os x,cygwin为true >> OS.mac?#或OS.osx?或OS.x? =>错误
试试Launchy gem(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?
。
为了清楚起见,Rubygems repo和该示例中的示例用法:
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”-注意,在JRuby中这将返回“ java”!(代码)
/cygwin|mswin|mingw|bccwin|wince|emx/
RUBY_ENGINE
#=>例如 “ ruby”,“ jruby”如果您不介意依赖项,并希望它对用户友好一些,那么可以使用库。具体来说,操作系统提供的方法类似于OS.mac?
或OS.posix?
。平台可以很好地区分各种Unix平台。Platform::IMPL
将返回,例如。:linux,:freebsd,:netbsd,:hpux。sys-uname和sysinfo是相似的。utilinfo是非常基础的,在Windows,Mac和Linux之外的任何系统上都会失败。
如果您想要具有特定系统详细信息的更高级的库,例如不同的Linux发行版,请参阅我关于在Ruby中检测Linux发行版的答案。
RUBY_PLATFORM
或如何RbConfig::CONFIG["host_os"]
填充的链接。看代码,对我来说仍然不清楚。