cdkでよくあると思う npm WARN をとにかく解消してみた

新規のcdkプロジェクトで発生しがちなnpm WARNについて、公式リポジトリの実装や公式ドキュメントを見つつ兎に角解消してみました。
2021.08.17

コーディング、及びビルドをする時には出来るだけWarningの表記を合わせて解消しておきたいものですが、原因がわかりづらく面倒で放置することはよくあります。

新規で追加したcdkのプロジェクトにて、ビルドする際に大量の npm WARN の数が目に付きすぎて鬱陶しくなり、幾つか解消してみました。

npm WARN EBADENGINE

初めて見た時には解釈し難いフレーズです。ログは以下のように出ているはず。

npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@google/clasp@2.4.1',
npm WARN EBADENGINE   required: { node: '^12.20.0 || ^14.13.1 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v14.4.0', npm: '7.20.5' }
npm WARN EBADENGINE }

Error-BAD-ENGINE の略称であり、モジュールが要求するエンジンバージョンと環境のエンジンバージョンが一致しない状況を指します。

t.test('bad engine with config loaded', t => {
  npm.config.loaded = true
  t.teardown(() => {
    npm.config.loaded = false
  })
  const path = '/some/path'
  const pkgid = 'some@package'
  const file = '/some/file'
  const stack = 'dummy stack trace'
  const er = Object.assign(new Error('foo'), {
    code: 'EBADENGINE',
    path,
    pkgid,
    file,
    stack,
  })
  t.matchSnapshot(errorMessage(er, npm))
  t.end()
})

求められているバージョンにアップデートしておきましょう。

nodenv install 14.13.1
nodenv local 14.13.1
npm install

npm WARN read-shrinkwrap

shrinkwarpを読め、とあります。そもそもshrinkwarpとはなんぞやという話になりますが、公式リポジトリのREADMEを読む限りでは公開用lockfileの扱いです。

今回の詳細メッセージは以下の通り。

This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!

扱っているエンジンバージョンによってlockfileVersionが異なるのですが、package-lock.json内のバージョン記述とエンジン内で扱うバージョンが食い違ったために発生したメッセージとなります。

lockfileVersion npm version memo
1 npm v5 and v6
2 npm v7 which is backwards compatible to v1 lockfiles.
3 npm v7 without backwards compatibility affordances

なお、EBADENGINEを解消する過程で消え去りました。

shrinkwarpとlockfileVersionについては公式ドキュメントに詳細な記載があるため、「知らんかった」という人は目を通しておくとよいかもしれません。

npm WARN old lockfile

lockfileが古い状況です。更新すると表示されなくなります。

npm i --package-lock-only

npm WARN xxxx@0.1.0 No repository field.

恐らくcdkで新規作成したプロジェクトだとよく見かけるかもしれません。stackoverflowにてそのまま質問になっているスレッドが存在します。

対処方法として、公開しないリポジトリであればpackage.jsonに "private": true を差し込んでしまうのが早いでしょう。

{
  ..
  "private": true
}

サブディレクトリの中に補助スタックのような形で仕込んでいる場合は以下のようにディレクトリ指定で入れることも可能です。

{
  "repository": {
    "type": "git",
    "url": "https://github.com/facebook/react.git",
    "directory": "packages/react-dom"
  }
}

あとがき

cdkはバージョン更新頻度も高く、気がつくと大量のWARNが出ていて、一つ一つの解消にはとても手間がかかるためについつい放置しがちです。ただ、長く放置しているとバージョン更新による脆弱性対策等への漏れ発生に繋がる可能性も出てきます。

週に1度、或いは月に1度等、定期的に見直すタイミングを設けるとよいかもしれません。