2016-06-05 19 views
1

Ich habe eine einfache node.js-App, die auf meiner OSX-Entwicklungsumgebung funktioniert. Aber wenn ich den gleichen Code nach Heroku schiebe, bekomme ich undefined an unerwarteten Orten zurück.So führen Sie eine Binärdatei auf Heroku aus

Die Bibliothek, die sich unvorhersehbar verhält, heißt pandoc. Es konvertiert Dokumentformate. Ich integriere es in meine Knoten-App mit dem Wrapper-Paket node-pdc. Pdc erfordert die Installation von Pandoc, aber es akzeptiert einen Pfad, um den Speicherort von Pandoc anzugeben, was ich lokal mache und es funktioniert großartig. Ich habe Pandoc global auf meinem lokalen Computer deinstalliert, um sicherzustellen, dass ich auf den korrekten Speicherort der ausführbaren Datei verwiesen habe.

Dies funktioniert genau so, wie vor Ort erwartet:

var pdc = require('pdc'); 
var path = require('path'); 
var fs = require('fs'); 
var Q = require('q'); 

// optional, if pandoc is not in PATH 
pdc.path = path.resolve(__dirname +'/pandoc/1.15.0.6/bin/pandoc'); 

module.exports.mdToHtml = function (input, callback) { 

    //TEST 
    pdc('## Emerson', 'markdown', 'html', ['--template=smashingtemplate'], function(err, result){ 
     console.log(result); // <h2>Emerson</h2> 
    }); 
    ... 

Aber auf Heroku, ich undefined in den Protokollen zu sehen. Es wirft keine Fehler auf. Warum funktioniert es auf meinem Laptop, aber nicht auf Heroku?

Beide Umgebungen laufen Knoten v4.0.0

Update 1: ich getestet, um zu sehen, ob pandoc auf Heroku ...

$ heroku run bash 

~ $ ls /app/pandoc/1.15.0.6/bin/  
pandoc 
~ $ /app/pandoc/1.15.0.6/bin/pandoc --version 
bash: /app/pandoc/1.15.0.6/bin/pandoc: cannot execute binary file: Exec format error 
~ $ ls /app/pandoc/1.15.0.6/bin/ -lah 
total 73M 
drwx------ 2 u35911 dyno 4.0K Jun 5 04:48 . 
drwx------ 4 u35911 dyno 4.0K Jun 5 04:48 .. 
-rwx------ 1 u35911 dyno 73M Jun 5 04:48 pandoc 

Die binären Dateien sind dort vorhanden war. Aber ich kann sie nicht laufen ...

aktualisieren 2

~ $ objdump -i /app/pandoc/1.15.0.6/bin/pandoc 
BFD header file version (GNU Binutils for Ubuntu) 2.24 
elf64-x86-64 
(header little endian, data little endian) 
    i386 
elf32-i386 
(header little endian, data little endian) 
    i386 
elf32-x86-64 
(header little endian, data little endian) 
    i386 
a.out-i386-linux 
(header little endian, data little endian) 
    i386 
pei-i386 
(header little endian, data little endian) 
    i386 
pei-x86-64 
(header little endian, data little endian) 
    i386 
elf64-l1om 
(header little endian, data little endian) 
    l1om 
elf64-k1om 
(header little endian, data little endian) 
    k1om 
elf64-little 
(header little endian, data little endian) 
    i386 
    l1om 
    k1om 
    plugin 
elf64-big 
(header big endian, data big endian) 
    i386 
    l1om 
    k1om 
    plugin 
elf32-little 
(header little endian, data little endian) 
    i386 
    l1om 
    k1om 
    plugin 
elf32-big 
(header big endian, data big endian) 
    i386 
    l1om 
    k1om 
    plugin 
pe-x86-64 
(header little endian, data little endian) 
    i386 
pe-i386 
(header little endian, data little endian) 
    i386 
plugin 
(header little endian, data little endian) 
srec 
(header endianness unknown, data endianness unknown) 
    i386 
    l1om 
    k1om 
    plugin 
symbolsrec 
(header endianness unknown, data endianness unknown) 
    i386 
    l1om 
    k1om 
    plugin 
verilog 
(header endianness unknown, data endianness unknown) 
    i386 
    l1om 
    k1om 
    plugin 
tekhex 
(header endianness unknown, data endianness unknown) 
    i386 
    l1om 
    k1om 
    plugin 
binary 
(header endianness unknown, data endianness unknown) 
    i386 
    l1om 
    k1om 
    plugin 
ihex 
(header endianness unknown, data endianness unknown) 
    i386 
    l1om 
    k1om 
    plugin 

       elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little 
      i386 elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 ---------- ---------- elf64-little 
      l1om ------------ ---------- ------------ ---------------- -------- ---------- elf64-l1om ---------- elf64-little 
      k1om ------------ ---------- ------------ ---------------- -------- ---------- ---------- elf64-k1om elf64-little 
     plugin ------------ ---------- ------------ ---------------- -------- ---------- ---------- ---------- elf64-little 

       elf64-big elf32-little elf32-big pe-x86-64 pe-i386 plugin srec symbolsrec verilog tekhex binary ihex 
      i386 elf64-big elf32-little elf32-big pe-x86-64 pe-i386 ------ srec symbolsrec verilog tekhex binary ihex 
      l1om elf64-big elf32-little elf32-big --------- ------- ------ srec symbolsrec verilog tekhex binary ihex 
      k1om elf64-big elf32-little elf32-big --------- ------- ------ srec symbolsrec verilog tekhex binary ihex 
     plugin elf64-big elf32-little elf32-big --------- ------- ------ srec symbolsrec verilog tekhex binary ihex 

Und ...

~ $ uname -a  
Linux 7f4e1d74-8fc2-47d2-89b7-97bfc9db30dd 3.13.0-85-generiC#129-Ubuntu SMP Thu Mar 17 20:50:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 

Ich könnte es nicht sein richtig zu verstehen, aber es sieht aus wie sie‘ Re sowohl für 64 Architektur.

~ $ file /app/pandoc/1.15.0.6/bin/pandoc 
/app/pandoc/1.15.0.6/bin/pandoc: Mach-O 64-bit x86_64 executable 

aktualisieren 3

Auf Anregung des @ MBS1 ...

Creating a relocatable binary 
----------------------------- 

It is possible to compile pandoc such that the data files 
pandoc uses are embedded in the binary. The resulting binary 
can be run from any directory and is completely self-contained. 

    cabal install hsb2hs # a required build tool 
    cabal install --flags="embed_data_files" citeproc-hs 
    cabal configure --flags="embed_data_files" 
    cabal build 

You can find the pandoc executable in `dist/build/pandoc`. Copy this wherever 
you please. 

Wenn ich cabal build tun, sagt es:

cabal: No cabal file found. 
Please create a package description file <pkgname>.cabal 

Lösung

Ich konnte es mit keiner der Lösungen, die cabal erfordern, arbeiten. Ich habe es schließlich mit stack arbeiten (sobald ich herausgefunden habe, wie es installiert wird).

$ stack install pandoc --flag pandoc:embed-data_files

Dann kopierte ich die erzeugte exec-Datei aus dem vm und schob es auf Heroku.

+0

In solchen Fällen sollten Sie in der gehosteten Umgebung nach ausführungsbezogenen ** Berechtigungen ** suchen. Möglicherweise ist dies die Ursache Ihres Problems. – vivek

+0

@vivek Ich werde überprüfen, aber sollte ich nicht einen Fehler in den Protokollen sehen, wenn es versucht, etwas ohne ausreichende Berechtigungen auszuführen? – emersonthis

+0

@vivek Bitte siehe ** Update 1 ** über – emersonthis

Antwort

2

Sie benötigen ein relocatable-Binary von pandoc auf den exakt gleichen OS zu bauen, wie Heroku verwendet, so ein Ubuntu Linux-System (es ist in einer virtuellen Maschine installieren, wenn Sie auf Mac OS X sind) und dann folgen this oder this . Grundsätzlich sollte Folgendes ein Re-lokalisierbar binär erstellen:

stack install pandoc --flag pandoc:embed_data_files 

Alternativ können Sie auch Docverter verwenden könnte, die Art von pandoc als Dienstleistung ist.

+0

Danke mb21. Das hilft sehr. Aber ich bin immer noch fest ... Die Anweisungen im ersten Link verwenden auf einer VM, die nicht "vagrantieren" ohne Fehler. Daher werden keine der erforderlichen Abhängigkeiten installiert. Der zweite Link setzt die Installation von "Cabal" voraus, aber ich kann es nicht verstehen. Ich habe eine VM, auf der Ubuntu 10.x läuft, und wenn ich 'sudo apt-get install haskell-platform 'benutze, heißt es' E: Paket haskell-platform konnte nicht gefunden werden' – emersonthis

+0

Offenbar ist 'ghc6' ein alternatives Repository ... I Ich versuche das ... – emersonthis

+0

Es ist nervig, weil [dies] (https://www.haskell.org/platform/#linux-ubuntu) behauptet, es sollte funktionieren. – emersonthis

1

Sie führen OSX lokal aus. Heroku läuft auf Ubuntu Linux. Diese Architekturen sind nicht binärkompatibel.