2016-05-11 16 views
11

La mia situazione è che sto avendo un po 'di problemi ad aggiungere pacchetti NPM esterni al mio progetto Serverless Framework (il pacchetto specifico è geopoint).Framework senza server: come aggiungere pacchetti NPM esterni?

Sono andato alla cartella principale del progetto Serverless ed è stato eseguito npm install geopoint --save. package.json è stato aggiornato con dependencies": { "geopoint": "^1.0.1" } e la cartella node_modules è stata creata.

mia struttura di cartelle si presenta così:
root-progetto-cartella
-Funzioni
--geospatial
--- handler.js
-node_modules
--geopoint

Nella mia funzioni/geospatial/handler.js Ho dichiarato il modulo geopoint con:

var geopoint = require('geopoint'); 
    var geopoint = require('../../geopoint'); 
    var geopoint = require('../../../geopoint'); 

La console lambda restituisce un errore di:

{ 
     "errorMessage": "Cannot find module '../../geopoint'", 
     "errorType": "Error", 
     "stackTrace": [] 
    } 

Come posso aggiungere correttamente i moduli NPM esterni a un progetto senza server quadro?

+1

Perché stai cercando di risolvere '../ geopoint' e' ../../ geopoint' in il primo posto? È qualcosa di specifico per Serverless? –

risposta

17

Penso che quello che stai vivendo sia lo stesso di quello che stavo vivendo recentemente. Potrei installare i pacchetti npm nella directory root dell'applicazione, ma nulla sarebbe stato distribuito su lambda.

La mia comprensione è che serverless distribuisce tutto in ciascuna directory di componenti (sottodirectory nella radice dell'applicazione). Nel tuo caso, sotto functions.

non ho potuto trovare molto nella documentazione serverless intorno a questo, ma quello che ho fatto è stato definire un file package.json sotto la mia cartella functions e quindi eseguire un NPM installare in quella sottodirectory. Quindi, dopo la distribuzione in lambda, è stato distribuito anche lo node_modules in questa directory, il che significa che il mio codice funzione potrebbe richiedere uno qualsiasi di questi moduli npm.

Quindi, la struttura delle cartelle dovrebbe apparire come questo:

root-project-folder 
|-functions 
|--package.json 
|--node_modules 
|---geopoint 
|--geospatial 
|---handler.js 
|-package.json 
|-node_modules 
|--geopoint 

Il beneficio anche qui è che è possibile distribuire solo le dipendenze di NPM che le funzioni hanno bisogno, senza quelli che senza server ha bisogno di distribuire le risorse .

Speriamo che questo aiuti - ancora una volta, non è sicuro che questa è la migliore pratica, proprio quello che faccio perché questo non è documentato da nessuna parte che ho trovato sul repository Serverless o in qualsiasi codice di esempio.

+2

Ciao, grazie per la risposta, ma ho trovato un altro modo. Nella s-functions.json della funzione ho modificato la riga '" handler ":" handler.handler "' a '" handler ":" funzioni/geospatial/get_bounding_coordinates/handler.handler ",' in modo che imposti il funzione root alla directory dei moduli del nodo. – taptipblard

+1

Ehi lì. Sì, grazie per l'invio.Ho scoperto che mentre il tuo suggerimento funzionava, il 'sls dash deploy' richiedeva molto più tempo perché tentava di raggruppare anche le dipendenze di sviluppo dalla mia cartella root_modules root. Mentre potrei usare 'npm prune --prod' penso che terrò un secondo node_modules come uso nella mia risposta a beneficio di implementazioni più veloci e non dovendo sfoltire le dipendenze degli sviluppatori ogni volta che distribuisco. –

+1

Sei corretto che la modifica del valore utilizzato per l'attributo gestore è la strada da percorrere. Dovresti essere in grado di strutturare le tue funzioni in modo da poter mantenere i node_modules molto specifici (come vuoi) per una data funzione. Ad esempio, ho un package.json per il mio progetto principale e quindi due ulteriori file package.json, uno per ogni set di funzioni lambda. – Mikelax

Problemi correlati