检测git是否安装的平台无关的方法

这是我如何检测ruby的git

`which git 2>/dev/null` and $?.success? 

但是,这不是跨平台的。 它在非Unix系统或没有那个命令的系统上失败(尽pipe我不确定这些是什么)。

我需要一种方法来检测满足这些条件的git:

  1. 即使在Windows上也能可靠地跨平台工作
  2. 不会输出任何内容到$ stdout或$ stderr
  3. less量的代码

更新:解决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可能是真正实现平台无关的选择。

我想,你需要这样做:

  1. 检查机器是否是基于Windows和Unix的
  2. 如果是Unix,请使用which
  3. 如果Windows, 是否有相当于 Windows上的“哪个”?