2011-01-04 9 views
6

Dies ist, wie ich git in Ruby erkennen:plattformunabhängige Art und Weise der Erfassung, wenn git installiert ist

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

Dies ist jedoch nicht plattformübergreifend. Es schlägt auf Nicht-Unix-Systemen oder solchen ohne den which Befehl fehl (obwohl ich nicht sicher bin, was diese sind).

brauche ich einen Weg git zu erkennen, dass diese Bedingungen erfüllt:

  1. Arbeiten zuverlässig plattformübergreifende, auch unter Windows
  2. nichts ausgibt auf $ stdout oder $ stderr
  3. kleine Menge Code

Update: die Lösung zu vermeiden, which insgesamt zu verwenden und Ausgabe auf NUL unter Windows umzuleiten.

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

Der system Befehl gibt bei Erfolg true false bei einem Fehler, uns die Reise nach $?.success? Einsparung, die benötigt wird, wenn Backticks.

+0

Vielleicht http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby/ 2108757 # 2108757 könnte helfen? – VonC

+0

Verzeihen Sie meine potentielle Dummheit, aber schreibt '' 'nicht zu stout? –

+0

@Steven: natürlich tut es, aber in einer eigenen Subshell, und Sie können sehen, dass ich Backticks verwendet, die diese Ausgabe in einem Rückgabewert erfasst, die ich dann verwerfen. Wenn 'which' etwas an STDERR geschrieben hat, würde Ruby das an $ stderr des Hauptprogramms weiterleiten (etwas, was ich nicht möchte), also habe ich' 2>/dev/null' verwendet, um das zu verarbeiten. – mislav

Antwort

4

Unter Windows gibt es keine /dev/null.

Ein Ansatz, den wir in verschiedenen Projekten wurden unter ist definiert NULL basierend auf RbConfig::CONFIG['host_os']

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

dann verwenden, Fehler- und Standardausgaben, um es umzuleiten.

Wie für die habe ich einen trivialen Bezug auf my blog

Aber, wenn Sie nur git Anwesenheit überprüfen mögen und nicht die Lage, keine Notwendigkeit zu tun, die mit einem einfachen System Rufs und die Überprüfung des resultierend in $? wird reichen.

this helps

+0

Wenn ich 'git' aufrufen und dann' $ ?. success? 'Überprüfe, ist das Ergebnis immer wahr, auch wenn git nicht installiert ist. (Ruby 1.9.2, i686-pc-mingw32 auf Win XP) – mislav

+1

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

+0

BTW, hatte diese Technik mit Rake-Compiler verwendet, um gmake/make plattformübergreifend zu erkennen: https: // github.com/luislavena/rake-compiler/blob/master/lib/rake/extensiontask.rb#L352-354 –

0

Vielleicht auf JRuby laufen und JGit verwendet, könnte eine Option sein, wirklich gehen plattformunabhängig.

+0

aber 'which' wird nicht auf Windows laufen. Das Problem ist nicht Ruby Portabilität. – zengr

+0

@zengr: Die Idee wäre nicht, die native Git-Implementierung überhaupt zu verwenden, sondern JGit, eine reine Java-Implementierung von Git. –

+0

aber wenn der Endbenutzer git (und nicht jgit) verwendet, wird es unentdeckt bleiben und die OPs App wird jgit WITH git installieren, das bereits auf der Maschine war. – zengr

1

Diese ist eine Lösung, die das Ausblenden von ausführbaren Dateien vermeidet und außerdem zuverlässig erkennen kann, wo sich die ausführbare Datei befindet. Es ist eine Alternative zu 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 

Verbrauch:

# 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 
Verwandte Themen