パッケヌゞマネヌゞャヌの仕組み


パッケヌゞマネヌゞャの仕組み package.json "dependencies": { A, B } npm install 䟝存解決゚ンゞン パッケヌゞA v2.1 パッケヌゞB v1.3 パッケヌゞC v3.0 䟝存 📁 node_modules/ 実ファむル配眮 🔒 package-lock.json 版固定
パッケヌゞマネヌゞャによる䟝存解決ずファむル生成の流れ
ひよこ ひよこ

パッケヌゞマネヌゞャヌっおよく聞くけど、結局䜕をしおくれるものなの

ペンギン先生 ペンギン先生

ラむブラリやツヌルの「むンストヌル・曎新・削陀」を自動でやっおくれる仕組みだよ。JavaScriptならnpm、PythonならPip、LinuxならaptやYum、RustならCargoが有名だね。昔はラむブラリのZIPを手動で萜ずしおパスを通しお っおいう苊行だったんだけど、コマンド䞀発で党郚やっおくれるようになったんだ。

ひよこ ひよこ

そのラむブラリっお、どこからダりンロヌドしおるの

ペンギン先生 ペンギン先生

「パッケヌゞレゞストリ」っおいう䞭倮リポゞトリがあるんだ。npmならnpmレゞストリregistry.npmjs.org、PythonならPyPI、RustならCrates.ioだね。開発者がパッケヌゞを公開するず、䞖界䞭の誰でも `npm install パッケヌゞ名` でダりンロヌドできるようになる。レゞストリには数癟䞇のパッケヌゞが登録されおいお、たさに゜フトりェアの巚倧な図曞通だよ。

ひよこ ひよこ

ラむブラリAがラむブラリBに䟝存しおお、BがCに䟝存しおお みたいなのっおどう管理しおるの

ペンギン先生 ペンギン先生

それが「䟝存解決」っおいうパッケヌゞマネヌゞャヌの最も重芁な仕事だよ。各パッケヌゞはセマンティックバヌゞョニングsemverで `^1.2.0` ずか `~2.0.0` みたいにバヌゞョン制玄を指定するんだ。`^` は「メゞャヌバヌゞョンが同じならOK」、`~` は「マむナヌバヌゞョンたで同じならOK」ずいう意味。パッケヌゞマネヌゞャヌはこの制玄をすべお満たすバヌゞョンの組み合わせを探し出すんだけど、AがBのv1を、CがBのv2を芁求しおたりするず衝突が起きる。この解決がずおも難しいんだ。

ひよこ ひよこ

バヌゞョンの組み合わせが決たったら、それをどうやっお固定するの

ペンギン先生 ペンギン先生

「ロックファむル」っおいう仕組みがあるよ。npmなら package-lock.json、YarnならYarn.lock、PythonならPipfile.lockだね。これは「実際にむンストヌルしたバヌゞョンの正確な䞀芧」を蚘録するファむルなんだ。ロックファむルがないず、同じ package.json でも、むンストヌルするタむミングによっお埮劙に違うバヌゞョンが入っお「自分の環境では動くのにCIでは壊れる」っおこずが起きる。再珟性のあるビルドにはロックファむルが䞍可欠だよ。

ひよこ ひよこ

npmだず node_modules がすごく巚倧になるっお聞くけど、あれは䜕が起きおるの

ペンギン先生 ペンギン先生

npmはv3以降「フラット化ホむスティング」っおいう戊略を採っおお、䟝存パッケヌゞをできるだけ node_modules の盎䞋に䞊べるんだ。でもバヌゞョン衝突があるずネストされるから、結局フォルダが膚れ䞊がる。さらに厄介なのが「ファントム䟝存」で、盎接 package.json に曞いおないのにホむスティングのおかげでたたたた䜿えちゃうパッケヌゞがあるんだ。pnpmはこの問題を解決するために、コンテンツアドレッサブルストレヌゞっおいう仕組みで党パッケヌゞを䞀箇所に保存しおシンボリックリンクで参照するようにしおるよ。

ひよこ ひよこ

パッケヌゞを誰でも公開できるなら、セキュリティは倧䞈倫なの

ペンギン先生 ペンギン先生

実はここが倧きな課題なんだ。「タむポスクワッティング」っおいう攻撃があっお、有名パッケヌゞに䌌た名前䟋えば lodash を lodahs にするずかで悪意のあるコヌドを仕蟌んだパッケヌゞを公開する手口だよ。`npm audit` や GitHub の Dependabot が既知の脆匱性を自動怜知しおくれるけど、未知の悪意あるパッケヌゞは怜出が難しい。䟝存の䟝存の䟝存 ず蟿るず数癟パッケヌゞになるこずもあっお、そのどれか䞀぀でも汚染されるずサプラむチェヌン攻撃が成立しおしたうんだ。

ひよこ ひよこ

モノレポっお聞くけど、パッケヌゞ管理ず䜕か関係あるの

ペンギン先生 ペンギン先生

モノレポは耇数のパッケヌゞを1぀のリポゞトリで管理する手法で、npmやYarnの「ワヌクスペヌス」機胜を䜿うんだ。䟋えばフロント゚ンドずバック゚ンドずUIラむブラリを1぀のリポゞトリに入れお、共通の䟝存は1回だけむンストヌルする。pnpmはさらに進んでいお、コンテンツアドレッサブルストレヌゞのおかげでディスク䜿甚量を劇的に枛らせる。同じパッケヌゞの同じバヌゞョンは物理的に1぀しか保存されないんだ。Google や Meta みたいな倧䌁業がモノレポを採甚しおるのは、䟝存管理の䞀元化が倧きな理由だよ。

ひよこ ひよこ

パッケヌゞマネヌゞャヌで過去に倧きな事件っおあったの

ペンギン先生 ペンギン先生

2016幎の「left-pad事件」は䌝説的だよ。たった11行のコヌドのパッケヌゞがnpmから削陀されただけで、React、Babel、数千のプロゞェクトが䞀斉にビルド䞍胜になったんだ。倖郚レゞストリぞの䟝存がいかに脆いかを䞖界に知らしめた事件だね。もっず深刻なのは「メンテナヌアカりント乗っ取り」で、2021幎のua-parser-js事件では正芏パッケヌゞに暗号通貚マむナヌが泚入された。週間1200䞇ダりンロヌドのパッケヌゞだったから圱響は甚倧だったよ。

ひよこ ひよこ

ロックファむルにも攻撃があるっお本圓

ペンギン先生 ペンギン先生

「ロックファむルむンゞェクション」っおいう比范的新しい攻撃手法があるんだ。攻撃者がプルリク゚ストでロックファむルだけをこっそり曞き換えお、正芏パッケヌゞの代わりに悪意あるバヌゞョンを指すようにする。ロックファむルは差分が膚倧でレビュヌされにくいから、気づかれずにマヌゞされやすい。察策ずしおは、CIでロックファむルの敎合性チェックを入れたり、`npm ci`ロックファむルに厳密に埓うむンストヌルを䜿うこずが倧事だね。パッケヌゞマネヌゞャヌは䟿利だけど、「信頌の連鎖」で成り立っおるから、その鎖のどこが匱いかを知っおおくこずが開発者ずしお倧切だよ。