20

Sto utilizzando AWS Lambda, che comporta la creazione di un archivio del mio script node.js, inclusa la cartella node_modules e il caricamento sulla relativa infrastruttura per l'esecuzione.Modulo nodo cross-compilare con binding nativi con node-gyp

Questo funziona correttamente, tranne quando si tratta di moduli nodo con collegamenti nativi (utilizzando node-gyp). Poiché l'associazione è stata rispettata e il progetto è stato archiviato sul mio computer locale (OS X), non è compatibile con i server di AWS (Amazon Linux).

Come è possibile compilare/installare in modo incrociato un modulo nodo (in particolare, node-sqlite3) così quando lo carico su un altro arco del server viene eseguito?

+0

Hai provato a utilizzare node-pre-gyp? node-sqlit3 già lo usa, quindi sei davanti al gioco lì. IIRC, dovrebbe scaricare la build su Amazon S3, in modo che tu possa compilare Amazon Linux (sistema operativo AWS Lambda). – zamnuts

+0

Sì, ho visto che node-sqlite3 utilizza node-pre-gyp, ma non ho veramente capito cosa significhi per me o come usarlo per ottenere ciò che voglio. –

+0

So che comporta un costo aggiuntivo, ma suggerisco di impacchettare la generazione di annunci su un'altra casella s3. Quindi trasferirlo nel tuo ambiente di produzione. Nota che se esegui il comando npm i dal tuo ambiente Linux, tutto funzionerebbe benissimo, se disponi degli strumenti di compilazione richiesti. –

risposta

9

Sebbene non sia realmente una soluzione al problema, una soluzione molto semplice potrebbe essere semplicemente la compilazione degli addon nativi su una macchina Linux.

Per la tua situazione particolare, vorrei usare Vagrant. Vagrant può creare macchine virtuali e configurarle in pochi secondi.

  1. Trova un'immagine del sistema operativo che assomiglia distro Linux di Amazon (Fedora, CentOS, altri che usano yum come gestore dei pacchetti - vedi Wiki)
  2. utilizzare un semplice script di configurazione che, se gestito da Vagrant all'avvio della macchina, sarà eseguire npm install (opzionalmente potrebbe anche rimuovere i node_modules cartella prima per garantire una nuova installazione)
  3. per un maggior comfort, lo script può anche creare il file zip per la distribuzione
  4. al termine dell'installazione, lo script wi ll spegnimento della VM per evitare un inutile consumo di risorse di sistema
  5. Distribuire!

Potrebbe richiedere un po 'di messa a punto se le librerie collegate non si trovano nella stessa posizione sulla macchina di destinazione, ma in generale questa mi sembra la soluzione migliore e più veloce.

+1

Anche se potrebbe non essere una soluzione alla mia * domanda *, risolve il mio problema. Grazie - esaminerò questo –

+0

Mi piacerebbe vedere una soluzione "reale" a questo; Mi piacerebbe installare node-sqlite su un Raspberry Pi. –

+0

@RichardTurner Non ci dovrebbero essere problemi con questo - solo "npm install" sul computer di destinazione. –

1

Le stesse linee di risposta di Robert, quando dovevo lavorare sul mio MAC in un sistema operativo diverso, uso vmware come il virtualizer gratuito di Oracle VirtualBox per ottenere un linux sul mio Mac, senza alcun costo per me. Oppure registrati per un nuovo account AWS, ottieni un micro per un anno gratis. Usalo per ottenere il tuo box Linux, fai quello che ti serve.

2

Durante l'installazione l'applicazione utilizzando Vagrant potrebbe essere sufficiente in alcuni casi, ho ritenuto necessario per costruire l'applicazione su Linux che è come vicino all'AMI Amazon Linux di Lambda possibile.

si può leggere la risposta originale qui: https://stackoverflow.com/a/34019739/303184

passaggi per farlo funzionare:

  1. Spawn nuova istanza EC2. Assicurati che sia basato su esattamente la stessa immagine come runtime AWS Lambda. È possibile rivedere i dettagli di Lambda env qui: http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html. Nel nostro caso, è stata l'AMI di Amazon Linux denominata amzn-ami-hvm-2015.03.0.x86_64-gp2.

  2. Installare nvm e utilizzarlo per installare la stessa versione di Node.js come su AWS Lambda. Al momento della stesura di questo, era v0.10.36. È possibile fare riferimento a http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html di nuovo per scoprirlo.

  3. Probabilmente sarà necessario installare il compilatore git & su EC2. Lo si può fare in esecuzione

    sudo yum install git gcc-c++
  4. Infine, clonare il vostro app per il vostro nuovo EC2 ed installare dependecies della tua app:

    nvm use 0.10.36 
    npm install --production 
    
  5. È quindi possibile scaricare facilmente i node_modules utilizzando scp o tali.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/10399857) – Eloims

+0

@Eloims Ho allegato la soluzione completa come richiesto. – xaralis