Платформо-независимый способ определения, установлен ли git - PullRequest
6 голосов
/ 04 января 2011

Вот как я обнаруживаю мерзавца в ruby:

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

Однако это не кроссплатформенность. Он не работает в не-Unix системах или в тех, у которых нет команды which (хотя я не уверен, что это такое).

Мне нужен способ обнаружения git, который удовлетворяет этим условиям:

  1. надежно работает кроссплатформенно, даже на Windows
  2. ничего не выводит в $ stdout или $ stderr
  3. небольшое количество кода

Обновление: решение состоит в том, чтобы вообще не использовать which и перенаправить вывод на NUL в Windows.

require 'rbconfig'
void = RbConfig::CONFIG['host_os'] =~ /msdos|mswin|djgpp|mingw/ ? 'NUL' : '/dev/null'
system "git --version >>#{void} 2>&1"

Команда system возвращает true при успехе и false при сбое, сохраняя нам поездку на $?.success?, которая необходима при использовании обратных галочек.

Ответы [ 4 ]

4 голосов
/ 04 января 2011

В Windows нет такой вещи, как /dev/null.

Один из подходов, который мы использовали в различных проектах, это определение NULL на основе RbConfig::CONFIG['host_os']

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

Затем используйте его для перенаправления на него STDOUT и STDERR.

Что касается, я сделал тривиальную ссылку на мой блог

Но, если вы просто хотите проверить наличие git, а не местоположение, нет необходимости делать это, с помощью простого системного вызова и проверки результата в $?.

Надеюсь, это поможет

1 голос
/ 06 января 2011

Это решение, которое позволяет избежать выделения для обнаружения исполняемых файлов, а также способно надежно определять, где расположен исполняемый файл. Это альтернатива 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
0 голосов
/ 04 января 2011

Я думаю, вам нужно будет сделать это:

  1. Проверьте, работает ли на компьютере Windows и Unix
  2. Если Unix, используйте which
  3. Если Windows, Есть ли эквивалент "который" в Windows?
0 голосов
/ 04 января 2011

Возможно, запуск на JRuby и использование JGit может быть вариантом, действительно подходящим для платформы.

...