🙄
Serverless Framework で Could not resolve "pg-native" が出る
対象とする人
- aws-nodejs-typescript テンプレートからサービスを作っている
-
pg
,@types/pg
を依存ライブラリに使っている - デプロイしようとしたら
Could not resolve "pg-native"
というエラーでできない
解決方法
ローカルにダミーの pg-native パッケージを作って package.json からそれを参照させると解消します。
まず、トップディレクトリに modules などの名前でディレクトリを切り(名前はなんでもいいです)、そこに index.js と package.json を置きます。
.
├── README.md
├── modules
│ └── pg-native
│ ├── index.js
│ └── package.json
├── node_modules
├── package.json
├── serverless.ts
├── src
├── tsconfig.json
├── tsconfig.paths.json
└── yarn.lock
それぞれの中身はこうします。
modules/pg-native/package.json
{
"name": "pg-native",
"version": "1.0.0",
"private": true,
"main": "index.js"
}
index.js
module.exports = null;
package.json の dependencies に先ほど作ったダミーの pg-native パッケージを参照させます。
package.json
...
"dependencies": {
...
"@types/pg": "^8.6.4",
"pg": "^8.7.3",
"pg-native": "file:./modules/pg-native"
},
...
これで yarn install したあと sls deploy ができるようになります。
詳細
私が遭遇したエラーはこういうものでした。
$ sls deploy
Running "serverless" from node_modules
Deploying serverless-exercise to stage dev (ap-northeast-1)
Compiling to node14 bundle with esbuild...
Compiling with concurrency: 10
⠙ Packaging (0s)
✘ [ERROR] Could not resolve "pg-native"
node_modules/pg/lib/native/client.js:4:21:
4 │ var Native = require('pg-native')
╵ ~~~~~~~~~~~
You can mark the path "pg-native" as external to exclude it from the bundle, which will remove
this error. You can also surround this "require" call with a try/catch block to handle this
failure at run-time instead of bundle-time.
✖ Stack serverless-exercise-dev failed to deploy (0s)
Environment: darwin, node 17.3.0, framework 3.1.1 (local) 3.1.1v (global), plugin 6.0.0, SDK 4.3.1
Credentials: Local, environment variables
Docs: docs.serverless.com
Support: forum.serverless.com
Bugs: github.com/serverless/serverless/issues
Error:
Error: Build failed with 1 error:
node_modules/pg/lib/native/client.js:4:21: ERROR: Could not resolve "pg-native"
...
参考
Discussion