🙄

Serverless Framework で Could not resolve "pg-native" が出る

2022/02/14に公開

対象とする人

  • 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"
  ...

参考

https://github.com/brianc/node-postgres/issues/838#issuecomment-702617329

Discussion