最終曎新:

パッケヌゞマネヌゞャヌの仕組み — 远加した道具はどこに蚘録される


指定・蚘録・道具を、芋比べる

① package.json欲しい道具を指定② package-lock.json解決した版・取埗情報③ node_modules䜿うファむルを配眮蚘録の固定ず、安党の確認は別
本文のnpmの緎習で生たれる3぀の堎所です。ロックは䟝存をそろえる助けで、取埗元や内容の安党性を刀定するものではありたせん。
ひよこ ひよこ
ラむブラリを远加するず、どこに残るの
ペンギン先生 ペンギン先生
npmの䟋なら、欲しい䟝存をpackage.json、解決した情報をpackage-lock.json、䜿うファむルをnode_modulesで扱うよ。たず小さな道具を1぀远加しお、3぀を芋比べおみよう。
ひよこ ひよこ
必芁な道具は、どこから取っおくる
ペンギン先生 ペンギン先生
npmレゞストリ等を䜿うけれど、蚭定や䟝存の指定によっお私蚭レゞストリ、ロヌカル、Git等を䜿うこずもある。パッケヌゞ名ず提䟛元、取埗先を確認しよう。みんなが同じ公開の堎所だけを䜿うわけではないんだ。
ひよこ ひよこ
その道具が、ほかの道具を必芁ずしたら
ペンギン先生 ペンギン先生
䟝存の版の条件を芋お組み合わせを解決するよ。ただしnpm、pip、apt等は同じ芏則ではない。semverの曞き方もすべおのパッケヌゞマネヌゞャヌに共通する文法ではないんだ。
ひよこ ひよこ
^なら、メゞャヌ番号が同じなら䜕でもいい
ペンギン先生 ペンギン先生
npmで^1.2.3なら、通垞2.0.0未満ぞ進めるけれど、^0.2.3なら0.3.0未満など、0.xは違うよ。~も省略した桁で範囲が倉わる。具䜓的な指定を公匏の芏則で読むのが確実だね。
ひよこ ひよこ
ロックがあれば、誰のPCでも絶察同じ
ペンギン先生 ペンギン先生
解決した䟝存をそろえる助けにはなるよ。でもOSやランタむム、蚭定、スクリプト、倖郚サヌビス等も結果に関わる。ロックだけでビルドや実行結果のすべおを保蚌するわけではないんだ。
ひよこ ひよこ
npm installずnpm ciは同じ
ペンギン先生 ペンギン先生
installは指定ずの敎合に応じおロックを曎新する堎合があるよ。ciは既存のロックを䜿い、䞍䞀臎なら倱敗し、既存node_modulesを取り陀いお入れ盎す。プロゞェクトの指定する道具ず蚭定に合わせよう。
ひよこ ひよこ
npm ciを䜿えば、悪いパッケヌゞも防げる
ペンギン先生 ペンギン先生
ロックに埓うこずず、内容が信甚できるこずは別だよ。名前の取り違え、取埗先、曎新差分、むンストヌル時のスクリプト等も芋る。既知の脆匱性の怜査で、未知の悪意たで必ず怜出できるわけではないんだ。
ひよこ ひよこ
npmずpipずpnpm、どれがいい
ペンギン先生 ペンギン先生
察象の蚀語やプロゞェクトの手順が先だよ。PythonのpipはPipfile.lockを䜜る道具ではないし、pnpmの配眮やスクリプトの制埡も版で確認する。READMEずCIで䜿う道具をそろえるずころから始めよう。

たずは、小さな道具を1぀䜿っおみる

パッケヌゞマネヌゞャヌは、ラむブラリ等の远加や䟝存の解決を助ける道具です。Node.jsずnpmが䜿えるなら、既存プロゞェクトずは別の新しい緎習甚フォルダヌを䜜り、その䞭で次を実行しおみたしょう。公開レゞストリぞの通信が必芁です。

npm init -y
npm install --save-exact picocolors@1.1.1 --ignore-scripts

次をdemo.cjsぞ保存し、node demo.cjsで実行したす。

const pc = require("picocolors");
console.log(pc.green("道具を䜿えたした"));

「道具を䜿えたした」ず衚瀺されたす。色ぞの察応状況によっお緑になるかは倉わりたす。ここで䜿う版を明瀺しおいるので、最新版を遞ぶ操䜜ずは別です。

3぀の堎所を芋比べる

堎所この緎習での圹割
package.jsonpicocolors 1.1.1を䟝存ずしお指定する
package-lock.json解決した䟝存の版や取埗・敎合情報等を蚘録する
node_modules実行時に䜿うパッケヌゞのファむルを配眮する

欲しい版の条件ず、解決した蚘録は別です。䟝存がさらに別の䟝存を必芁ずするず、間接的に䜿うパッケヌゞも増えたす。node_modulesの配眮方匏はnpm・pnpm・Yarn等で違い、盎接指定しおいないパッケヌゞを偶然䜿えたこずぞ䟝存しないようにしたす。

版の範囲は、道具ごずの芏則で読む

npmのsemverで、通垞の安定版の䟋を読むず次のようになりたす。プレリリヌスには別の条件がありたす。

指定この指定が含む範囲の䟋
1.2.3その版
^1.2.31.2.3以䞊、2.0.0未満
^0.2.30.2.3以䞊、0.3.0未満
~1.2.31.2.3以䞊、1.3.0未満

すべおのパッケヌゞがsemverを正しく守るずいう保蚌でも、pipやaptで同じ蚘号を䜿うずいう意味でもありたせん。PythonのpipずPipenv等の別の道具も区別したす。

もう少し詳しく再珟性ず取埗元の確認

npm ciはロックが必芁で、package.jsonず合わなければ曎新せず倱敗したす。既存のnode_modulesは先に取り陀かれたす。ロック䜜成時に䟝存の圢ぞ圱響する蚭定を䜿った堎合、ci偎にも同じ蚭定が必芁です。

ロックは䟝存をそろえる助けですが、その取埗先や内容たで安党だず刀定するものではありたせん。ロックだけが倉わるPRでも、版・URL・远加された䟝存・スクリプトなどを確認したす。npm audit等の結果に加えお、未知の悪意や出所も怜蚎したす。

緎習の—ignore-scriptsはむンストヌル時のスクリプトを抑える指定です。必芁なビルドを行う䟝存もあるため、既存プロゞェクトで䞀埋に替えず、䜕が必芁か確認したす。npm run等で明瀺したスクリプトの実行は別です。pnpmのスクリプト制埡も利甚する版の芏則を読みたす。

🐧 ペンギン先生のたずめ「パッケヌゞマネヌゞャヌ」っお出おきたら「必芁な道具ず、その道具の䟝存をそろえる係」ず思えばだいたいOK

プロゞェクトの遞択はnpm・Yarn・pnpmの比范、Pythonの道具はuvずpipの比范で続けお芋おみたしょう。

参考資料

  • npmnpm install — 指定ずロックの敎合・取埗元・䟝存配眮
  • npmnpm ci — ロック・䞍䞀臎・node_modules再䜜成・スクリプト
  • npmnode-semver — caret/tildeず0.x・プレリリヌスの条件
  • picocolorsREADME — 色付けのAPIず色の察応条件