2016-05-11 16 views
11

Meine Situation ist, dass ich ein wenig Mühe habe, externe NPM-Pakete zu meinem Serverless Framework-Projekt hinzuzufügen (spezifisches Paket ist Geopoint).Serverless Framework: Wie fügt man externe NPM-Pakete hinzu?

Ich ging in den Stammordner des Serverless-Projekts und lief npm install geopoint --save. package.json wurde mit dependencies": { "geopoint": "^1.0.1" } aktualisiert und der Ordner node_modules wurde erstellt.

Meine Ordnerstruktur sieht wie folgt aus:
root-Projekt-Ordner
-Funktionen
--geospatial
--- handler.js
-node_modules
--geopoint

In meinem Funktionen/Geospatial/Handler.js Ich erklärte das Geopoint-Modul mit:

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

Die Lambda-Konsole gibt einen Fehler aus:

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

Wie kann ich richtig externe NPM-Module zu einem Projekt Serverless Rahmen hinzufügen?

+1

Warum Sie versuchen, 'zu lösen ../ geopoint' und' ../../ geopoint' in den ersten Platz? Ist es etwas Spezifisches für Serverless? –

Antwort

17

Ich denke, was Sie erleben, ist das gleiche wie das, was ich kürzlich erlebt habe. Ich könnte npm-Pakete in meinem Anwendungsstammverzeichnis installieren, aber nichts würde zu Lambda bereitgestellt werden.

Mein Verständnis ist, dass Serverless alles unter jedem Komponentenverzeichnis (Unterverzeichnis unter dem Anwendungsstammverzeichnis) bereitstellt. In Ihrem Fall unter functions.

Ich konnte nicht viel in der serverlosen Dokumentation finden, aber was ich getan habe, war eine package.json Datei unter meinem functions Ordner zu definieren und dann eine npm-Installation in diesem Unterverzeichnis auszuführen. Nach der Bereitstellung in Lambda wurde node_modules unter diesem Verzeichnis ebenfalls bereitgestellt, was bedeutet, dass mein Funktionscode möglicherweise eines dieser npm-Module erfordert.

So sollte Ihre Ordnerstruktur wie folgt aussehen jetzt:

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

Der Vorteil auch hier ist, dass Sie nur die npm Abhängigkeiten bereitstellen können, die Ihre Funktionen benötigen, ohne diejenigen, die serverless Ihre Ressourcen bereitstellen muss .

Hoffentlich hilft das - noch einmal, nicht sicher, das ist Best Practice, nur was ich tue, weil dies nirgendwo dokumentiert ist, die ich auf dem Serverless-Repository oder in jedem Beispiel Code finden konnte.

+2

Hallo, danke für die Antwort, aber ich habe einen anderen Weg gefunden. In der s-functions.json der Funktion habe ich die Zeile '" handler ":" handler.handler "' in '" handler "geändert:" functions/geospatial/get_bounding_coordinates/handler.handler ",' so dass es gesetzt wird function root zum Verzeichnis der Knotenmodule. – taptipblard

+1

Hey da. Ja, danke, dass du das geschickt hast.Ich fand, dass die 'sls dash deploy' viel länger gedauert hat, als der Vorschlag funktionierte, da sie auch versucht hat, Entwicklungsabhängigkeiten von meinem Root-Ordner node_modules zu bündeln. Obwohl ich "npm prune --prod" verwenden könnte, denke ich, dass ich ein zweites node_modul beibehalten werde, wie ich es in meiner Antwort verwende, um schnellere Bereitstellungen zu ermöglichen und Dev-Abhängigkeiten nicht jedes Mal neu zu verteilen. –

+1

Sie haben Recht, dass das Bearbeiten des Werts, der für das Handler-Attribut verwendet wird, der richtige Weg ist. Sie sollten in der Lage sein, Ihre Funktionen so zu strukturieren, dass Sie die node_module sehr genau (wie Sie wollen) für eine bestimmte Funktion (en) behalten können. Zum Beispiel habe ich eine package.json für mein Hauptprojekt und dann zwei zusätzliche package.json-Dateien, eine für jeden Satz von Lambda-Funktionen. – Mikelax

Verwandte Themen