这是我如何检测ruby的git:
`which git 2>/dev/null` and $?.success?
但是,这不是跨平台的。 它在非Unix系统或没有那个命令的系统上失败(尽pipe我不确定这些是什么)。
我需要一种方法来检测满足这些条件的git:
更新:解决scheme是避免使用which
,并将输出redirect到Windows上的NUL
。
require 'rbconfig' void = RbConfig::CONFIG['host_os'] =~ /msdos|mswin|djgpp|mingw/ ? 'NUL' : '/dev/null' system "git --version >>#{void} 2>&1"
system
命令在成功时返回true,在失败时返回false,为我们节省了$?.success?
的行程$?.success?
这是使用反引号时需要的。
Windows上没有/dev/null
这样的东西。
我们在不同的项目中采取的一种方法是基于RbConfig::CONFIG['host_os']
定义NULL
NULL = RbConfig::CONFIG['host_os'] =~ /mingw|mswin/ ? 'NUL' : '/dev/null'
然后使用它将STDOUT和STDERR重定向到它。
至于哪一个,我在我的博客上做了一个简单的参考
但是,如果你只是想检查git的存在而不是位置,不需要做哪个,用一个简单的系统调用和检查所得到的$?
将是足够的。
希望这可以帮助
这是一个解决方案,它可以避免检出可执行文件,也可以可靠地检测到可执行文件的位置。 这是另一种选择。
def which cmd exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| exts.each { |ext| exe = "#{path}/#{cmd}#{ext}" return exe if File.executable? exe } end return nil end
用法:
# Mac OS X where 'ruby' #=> /opt/local/Cellar/ruby-enterprise-edition/2010.02/bin/ruby # Windows where 'ruby' #=> C:\Program Files\Ruby192\bin/ruby.exe
也许在JRuby上运行并使用JGit可能是真正实现平台无关的选择。
我想,你需要这样做:
which