2011-01-04 13 views
6

Ésta es la forma en que detecto git en rubí:manera independiente de la plataforma de detectar si está instalado git

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

Sin embargo, esto no es multiplataforma. Falla en sistemas no unix o aquellos sin el comando which (aunque no estoy seguro de cuáles son).

necesito una manera de detectar git que satisface estas condiciones:

  1. funciona de forma fiable multiplataforma, incluso en Windows
  2. no hace nada de salida a la salida estándar $ o $ stderr
  3. pequeña cantidad de código

actualización: la solución es para evitar el uso de which en conjunto y para redirigir la salida a NUL en Windows.

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

Los system comando devuelve verdadero en falso en caso de fracaso, ahorrándonos el viaje a $?.success? que se necesita cuando se utiliza acentos abiertos.

+0

Tal http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby/ 2108757 # 2108757 podría ayudar? – VonC

+0

Perdonar mi tontería potencial, ¿pero no 'qué' escribir en stdout? –

+0

@Steven: por supuesto que sí, pero en su propia subshell, y se puede ver que utilicé backticks que captura esa salida en un valor de retorno que luego descarto. Si 'which' le escribió algo a STDERR, ruby ​​lo reenviará a $ stderr del programa principal (algo que no deseo que suceda), así que usé' 2>/dev/null' para manejarlo. – mislav

Respuesta

4

No existe tal cosa como /dev/null en Windows.

Un enfoque hemos estado tomando en diferentes proyectos es definir NULL basado en RbConfig::CONFIG['host_os']

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

A continuación, utilizar eso para redirigir stdout y stderr a ella.

En cuanto a la cual, hice una referencia trivial en my blog

Pero, si sólo desea comprobar la presencia Git y no la ubicación, no hay necesidad de hacer lo que, con una simple llamada al sistema y la verificación del resultado $? será suficiente.

Esperanza esto ayuda

+0

Cuando llamo a 'git' y luego a' $ ?. success? ', El resultado siempre es verdadero, incluso si git no está instalado. (ruby 1.9.2, i686-pc-mingw32 en Win XP) – mislav

+1

https://gist.github.com/765328 –

+0

BTW, había utilizado esta técnica con rake-compiler para detectar gmake/make en todas las plataformas: https: // github.com/luislavena/rake-compiler/blob/master/lib/rake/extensiontask.rb#L352-354 –

0

Tal vez se ejecuta en JRuby y el uso de JGit podría ser una opción para ir realmente independiente de la plataforma.

+0

pero 'which' no se ejecutará en Windows. El prob. no es la portabilidad de ruby – zengr

+0

@zengr: La idea sería no utilizar la implementación nativa de git para nada, sino JGit, una implementación Java pura de git. –

+0

, pero ¿qué pasa si el usuario final está usando git (y no jgit), pasará desapercibido y la aplicación OP instalará jgit WITH git que ya estaba en la máquina. – zengr

1

Este es una solución que evita bombardeos para detectar ejecutables y también es capaz de detectar de manera confiable dónde se encuentra el ejecutable. Es una alternativa al 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 

Uso:

# 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 
Cuestiones relacionadas