web-dev-qa-db-ja.com

サーバーレスフレームワーク:外部NPMパッケージを追加する方法

私の状況では、サーバーレスフレームワークプロジェクトに外部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モジュールをサーバーレスフレームワークプロジェクトに適切に追加するにはどうすればよいですか?

22
taptipblard

あなたが経験していることは、私が最近経験していたことと同じだと思います。アプリケーションのルートディレクトリに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依存関係のみをデプロイできることです。

これが役に立てば幸いです-もう一度言いますが、これがベストプラクティスであるかどうかはわかりませんが、サーバーレスリポジトリやコード例のどこにも記載されていないため、私がやっていることだけです。

27
e_m0ney

私にとって最良の解決策はサーバーレスプラグインでした:serverless-plugin-include-dependencies

serverless-plugin-include-dependencies

4
Maximi

次のことができます。

# serverless.yml
custom:
  webpack:
    includeModules:
      packagePath: '../package.json' # relative path to custom package.json file.

参照ドキュメント

2
Marcin Rapacz