2016-05-11 12 views
11

私の状況では、Serverless Frameworkプロジェクト(特定のパッケージはgeopointです)に外部NPMパッケージを追加する際に少し問題があります。サーバーレスフレームワーク:外部NPMパッケージを追加する方法は?

私はServerlessプロジェクトのルートフォルダに行き、npm install geopoint --saveを実行しました。 package.jsonがdependencies": { "geopoint": "^1.0.1" }で更新され、node_modulesフォルダが作成されました。

マイフォルダ構造は次のようになります。
ルートプロジェクトフォルダ
-functions
--geospatial
--- handler.js
-node_modules私は
--geopoint

functions/geospatial/handler.js私はgeopointモジュールを次のように宣言しました:

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

ラムダコンソールはエラーを返します:

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

どのように私は適切にサーバレスFrameworkプロジェクトに外部のNPMモジュールを追加することができますか?

+1

なぜあなたは '../ geopoint'と' ../../ geopoint'を解決しようとしています最初の場所?それはServerless特有のものですか? –

答えて

17

あなたが経験していることは、私が最近経験したことと同じだと思います。私はアプリケーションのルートディレクトリにnpmパッケージをインストールできましたが、何もlambdaに展開されませんでした。

私が理解していることは、サーバーレスでは、各コンポーネントディレクトリ(アプリケーションルートの下のサブディレクトリ)の下にあるすべてを展開することです。あなたの場合、functionsより。

サーバーレスのドキュメントではこれを見つけることができませんでしたが、私が行ったことはfunctionsフォルダの下にpackage.jsonファイルを定義し、そのサブディレクトリにnpmをインストールして実行しました。そして、lambdaにデプロイした後、このディレクトリの下にあるnode_modulesもデプロイされました。つまり、私のファンクションコードがこれらのnpmモジュールを必要とする可能性があります。

だから、あなたのフォルダ構造は次のようになります。ここにも

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

利益だけサーバレスがあなたのリソースを配置する必要があるものなしで、あなたの関数が必要NPMの依存関係を展開できるということです。

サーバレスリポジトリやサンプルコードのどこにも記載されていないため、これがベストプラクティスであることを再確認してください。

+2

こんにちは、答えをありがとうが、私は別の方法を見つけた。関数のs-functions.jsonでは、 "handler": "handler.handler" '〜" "handler": "functions/geospatial/get_bounding_coordinates/handler.handler"という行を編集して、ノードモジュールのディレクトリに移動します。 – taptipblard

+1

ねえ、そこに。うん、それを送ってくれてありがとう。あなたの提案がうまくいっている間、 'sls dash deploy'は私のルートnode_modulesフォルダから開発依存関係を束ねようとしたので、ずっと時間がかかりました。私は 'npm prune --prod'を使うことができますが、デプロイするたびにdevの依存関係を刈り取る必要はなく、高速なデプロイメントのために私の答えで使用するような2番目のnode_modulesを保つつもりです。 –

+1

ハンドラ属性に使用されている値を編集するのが正しい方法です。 node_modulesを特定の関数に(必要に応じて)非常に限定的に保つことができるように、関数を構造化できるはずです。たとえば、私はメインプロジェクト用のpackage.jsonを持っていて、さらに2つのpackage.jsonファイルを持っています.1つはラムダ関数のセットごとです。 – Mikelax

関連する問題