私の状況では、サーバーレスフレームワークプロジェクトに外部NPMパッケージを追加するときに少し問題があります(特定のパッケージはgeopointです)。
サーバーレスプロジェクトのルートフォルダーに移動し、npm install geopoint --save
を実行しました。 package.jsonがdependencies": { "geopoint": "^1.0.1" }
で更新され、node_modulesフォルダーが作成されました。
私のフォルダ構造は次のようになります:
ルートプロジェクトフォルダー
-機能
-地理空間
--- 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": []
}
外部NPMモジュールをサーバーレスフレームワークプロジェクトに適切に追加するにはどうすればよいですか?
あなたが経験していることは、私が最近経験していたことと同じだと思います。アプリケーションのルートディレクトリにnpmパッケージをインストールできましたが、lambdaには何もデプロイされませんでした。
私の理解では、サーバーレスは各コンポーネントディレクトリ(アプリケーションルートの下のサブディレクトリ)の下にすべてを展開します。あなたの場合、functions
の下。
私はこれに関するサーバーレスのドキュメントには多くを見つけることができませんでしたが、私がしたことはpackage.json
ファイルをfunctions
フォルダーの下に置き、そのサブディレクトリーでnpm installを実行します。次に、ラムダにデプロイした後、node_modules
このディレクトリの下にもデプロイされました。つまり、私の関数コードはこれらのnpmモジュールのいずれかを必要とする可能性があります。
したがって、フォルダー構造は次のようになります。
root-project-folder
|-functions
|--package.json
|--node_modules
|---geopoint
|--geospatial
|---handler.js
|-package.json
|-node_modules
|--geopoint
ここでの利点も、サーバーレスがリソースをデプロイする必要がないものを除いて、関数が必要とするnpm依存関係のみをデプロイできることです。
これが役に立てば幸いです-もう一度言いますが、これがベストプラクティスであるかどうかはわかりませんが、サーバーレスリポジトリやコード例のどこにも記載されていないため、私がやっていることだけです。
私にとって最良の解決策はサーバーレスプラグインでした:serverless-plugin-include-dependencies
次のことができます。
# serverless.yml
custom:
webpack:
includeModules:
packagePath: '../package.json' # relative path to custom package.json file.