コース目次 / 第2章
lockfile — 再現性と、整合性ハッシュ
package-lock.jsonのintegrityハッシュが「落としたものが意図した中身と一字一句同じ」ことを保証する仕組みだと理解します。npm ciがpackage.jsonとlockfileの不一致を厳格に拒否する挙動を実際に見ます。
npm install を実行すると、package-lock.json というファイルが作られます(または更新されます)。これは、「今回、実際に何がインストールされたか」の正確な記録です。
integrity ハッシュ — 「一字一句同じ」の保証
package-lock.json の中身を覗いてみます。
"node_modules/lodash": {
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
...
}
integrity は、sec-tooling で学んだハッシュによる真正性確認と、まったく同じ仕組みです。lodash@4.18.1 というファイルの中身から計算した SHA-512 の値がここに記録されていて、次に誰かが npm install するとき、npm はダウンロードしたファイルのハッシュを計算し直し、この値と一致するかを確かめます。
一致しなければ、インストールはエラーになります。これにより、「同じバージョン番号のはずなのに、中身がすり替わっている」という事態を検知できます——パッケージのレジストリが侵害された場合や、通信経路で改ざんされた場合の防波堤です。
npm ci — lockfile を、厳格に守る
npm install は、package.json の範囲(^4.17.15 のような)に収まる限り、柔軟にバージョンを選びます。一方、npm ci(clean install)は、lockfile に書かれた内容と、寸分違わず一致させることを要求します。実際に試します。
# lockfile はそのままに、package.json にだけ新しい依存を足す
npm pkg set dependencies.is-odd="^3.0.1"
rm -rf node_modules
npm ci
npm error code EUSAGE
npm error `npm ci` can only install packages when your package.json and
npm error package-lock.json or npm-shrinkwrap.json are in sync. Please
npm error update your lock file with `npm install` before continuing.
npm error
npm error Missing: is-odd@3.0.1 from lock file
package.json に is-odd を足したのに、package-lock.json を更新し忘れていたので、npm ci はきっぱり失敗しました。「lockfile を先に npm install で更新してから、もう一度」と、はっきり教えてくれます。
なぜ、この厳格さが防御になるのか
npm install は開発時に。npm ci はCI・デプロイ時に。これが実務の定石です。
CI やデプロイの場では、「開発者の手元と寸分違わぬものが、そのまま動く」ことが命綱です。npm install は良かれと思って柔軟にバージョンを選び直すことがあり、「手元では動いたのに、本番では違うバージョンが入って動かない(あるいは、知らないうちに脆弱なバージョンに変わっている)」という事故を招きかねません。npm ci の厳格さは、この再現性のズレそのものを、仕組みで防ぎます。
lockfile は、必ずリポジトリに含める
package-lock.json を .gitignore に入れて除外する——というのは、避けるべき習慣です。lockfile が無いと、開発者ごとに・デプロイのたびに、微妙に違うバージョンが入りうる。lockfile は、依存関係の「約束の記録」として、コードと一緒にバージョン管理します。
持ち帰る一言
lockfileは、再現性の保証。integrityハッシュは、中身の保証。 npm ci は、その約束をCI・デプロイの場で厳格に守らせる道具。次は、パッケージ名そのものが騙されるケース——typosquattingを見ます。
こうなっていればOK
卒業まであと2章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。