2016-03-19 7 views
1

Ich arbeite an einem Open-Source-Rails 4-Projekt, das PDF Tool Kit (PDF-Formulare 'Gem) verwendet, um PDF-Formulare basierend auf in den App gespeicherten Informationen automatisch zu füllen Datenbank. PDFtk erfordert die Installation von Binärdateien und das instanziierte PDFtk-Modell erfordert einen Pfad zu den Binärdateien. Der Pfad muss dynamisch sein, damit er auf Heroku, Mac OS X und Windows funktioniert. Ich kann den Pfad auf einer * nix-Maschine mit dem 'which' Befehl finden. Windows verwendet jedoch nicht 'which', sondern 'where'.Verwenden Sie Ruby, um zu erkennen, ob Plattform auf CLI-Befehl reagiert

Gibt es eine Möglichkeit festzustellen, ob die Plattform auf einen Befehl reagiert, und wenn ja, dann Befehl ausführen?

Mein bester Versuch ist es, Plattform mit RbConfig zu erkennen (siehe unten). Einige Windows-Plattformen (z. B. Cygwin) reagieren jedoch auf * nix-Befehle. Als Mac Benutzer kenne ich nicht jede Plattform für Windows.

def pdftk 
    # Use path stored in Heroku env vars or else get path to local binaries 
    @pdftk ||= PdfForms.new(ENV['PDFTK_PATH'] || local_path) 
end 

def local_path 
    os = RbConfig::CONFIG['arch'] 
    if /mswin/ =~ os 
    path = `where pdftk` # Get pdftk filepath, Windows equiv of *nix 'which' command 
    else 
    path = `which pdftk` # Get pdftk filepath on POSIX systems 
    end 

    path 
end 
+0

Könnten Sie näher erläutern, warum _Rails_ project auf Windows-Hosts ausgeführt werden sollte? Werden Sie das gesamte Projekt an den Endbenutzer versenden? Ob der Benutzer mit der Installation von rails project gut ist, würde ich mit der obligatorischen Einstellung in kinda 'config.rb' für den Pfad gehen, mit dem Standardwert, der auf den Ort gesetzt wird, an dem diese Bibliothek installiert wird" wie du im OP gezeigt hast.) – mudasobwa

+0

@mudasobwa Ich arbeite remote mit Entwicklern zusammen, die Windows-Maschinen verwenden, wo einige nicht in der Lage/willens sind, Cygwin oder ähnliches zu verwenden. Die Verwendung eines 'config.rb' mit fest codierten Dateipfaden würde das Problem der Plattformerkennung nicht beseitigen. – femmestem

+0

Fair genug. Ich meinte nicht hart codierte Wege. Ich meinte, Sie könnten die Mitbearbeiter dazu zwingen, den Inhalt dieser Datei zu ändern oder die env-Variable festzulegen. Schließlich sind sie Entwickler, keine Kunden. Und, IMHO, das ist kein Codepiece, das wirklich poliert werden muss. Die Plattformerkennung ist, wie Sie gezeigt haben, schon viel besser als nichts. – mudasobwa

Antwort

1

Der where Befehl sollte mindestens seit Windows 7.

Wenn Sie jruby verwenden, die RbConfig::CONFIG['arch'] Befehl geben Ihnen einen Java-bezogenen Kennung zur Verfügung. Nach dieser question können Sie stattdessen host_os verwenden (getestet mit jruby 9000 in Windows 7).

können Sie auch die machen den Code freundlich zu Ihren Mitarbeitern durch Fehler des Anrufs an die Prüfung, die/where Befehl:

def local_path 
    os = RbConfig::CONFIG['host_os'] 
    if /mswin/ =~ os 
    path = `where pdftk` # Get pdftk filepath, Windows equiv of *nix 'which' command 
    else 
    path = `which pdftk` # Get pdftk filepath on POSIX systems 
    end 
    unless $?.success? 
    log.error "failure to find the pdfkit excutable path" 
    puts "Please set the PDFTK_PATH environment variable to point to the pdftkkit executable" 
    path = "" # maybe throw an exception here 
    end 
    path 
end 
+0

Es ist schwer, ** eine ** richtige Antwort zwischen deiner und 10dot zu akzeptieren, weil ich beide in Kombination verwendet habe. Ich habe 10dots Antwort als korrekt akzeptiert, weil sie spezifisch für das war, was ich erreichen wollte. Ich stimme jedoch auch Ihrer Antwort für allgemein gute Ratschläge zu, wie Sie die Verantwortung auf die anderen Entwickler verlagern können, um ihre Umgebung richtig zu konfigurieren und sie mit guten Fehlermeldungen durchzusetzen. – femmestem