【问题标题】:Platform-independent way of detecting if git is installed检测是否安装了 git 的独立于平台的方法
【发布时间】:2011-01-04 19:21:43
【问题描述】:

这就是我在 ruby​​ 中检测 git 的方式:

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

但是,这不是跨平台的。它在非 unix 系统或没有 which 命令的系统上失败(尽管我不确定它们是什么)。

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

  1. 即使在 Windows 上也能可靠地跨平台运行
  2. 不向 $stdout 或 $stderr 输出任何内容
  3. 少量代码

更新:解决方案是完全避免使用which,并将输出重定向到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?

【问题讨论】:

  • 原谅我潜在的愚蠢,但which 不会写入标准输出吗?
  • @Steven:当然可以,但是在它自己的子shell中,您可以看到我使用了反引号,它在返回值中捕获了该输出,然后我将其丢弃。如果which 向 STDERR 写了一些东西,ruby 会将其转发给主程序的 $stderr(我不希望发生这种情况),所以我使用2>/dev/null 来处理它。
  • @mislav: 恐怕我对你使用的技术不熟悉,但如果你可以同时拦截 stdout 和 stderr,你就可以避免依赖which,直接运行@ 987654334@ 代替。我怀疑我离我很远......
  • 关于 RUBY_PLATFORM 的一点是它不能正确检测 Java。看到这个帖子:blog.emptyway.com/2009/11/03/…

标签: ruby windows git shell detect


【解决方案1】:

在 Windows 上没有 /dev/null 这样的东西。

我们在不同项目中采用的一种方法是基于RbConfig::CONFIG['host_os'] 定义NULL

NULL = RbConfig::CONFIG['host_os'] =~ /mingw|mswin/ ? 'NUL' : '/dev/null'

然后使用它来将 STDOUT 和 STDERR 都重定向到它。

至于哪一个,我在my blog上做了一个琐碎的参考

但是,如果您只想检查 git 存在而不是位置,则无需执行此操作,只需简单的系统调用并检查$? 的结果就足够了。

希望对你有帮助

【讨论】:

  • 当我调用git然后检查$?.success?时,结果总是正确的,即使没有安装git。 (红宝石 1.9.2,Win XP 上的 i686-pc-mingw32)
  • 顺便说一句,已将此技术与 rake-compiler 一起用于跨平台检测 gmake/make:github.com/luislavena/rake-compiler/blob/master/lib/rake/…
  • 我可以看到它现在可以工作了。我一定是第一次做错了什么
【解决方案2】:

这是一种解决方案,它避免了检测可执行文件并能够可靠地检测可执行文件的位置。它是which 的替代品。

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

【讨论】:

    【解决方案3】:

    也许在JRuby 上运行并使用JGit 可能是真正独立于平台的选项。

    【讨论】:

    • 但 'which' 不会在 Windows 上运行。问题。不是 ruby​​ 的可移植性。
    • @zengr:我们的想法是根本不使用原生 git 实现,而是使用 JGit,一个纯 Java 的 git 实现。
    • @zengr 我不知道这里的实际用例,但如果应用程序需要使用 git,它可以捆绑 JGit,使用它,而不是安装任何东西。
    • 当我要求“平台无关”时,我并没有想到将自己限制在一个 Ruby 实现中:)
    【解决方案4】:

    我认为,你需要这样做:

    1. 检查机器是否基于 windows 和 unix
    2. 如果是 Unix,请使用 which
    3. 如果是 Windows,Is there an equivalent of 'which' on windows?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多