導入
初歩的だが「npm installとnpm install --saveとは何が違うんだ?」と疑問に思ったので動作をきちんと調べた。
環境
$ zsh --version
zsh 5.9 (x86_64-apple-darwin23.0)
$ node -v
v20.16.0
$ npm -v
10.8.1
調査
まずは公式のリファレンスをきちんと読む。
Configurationのsaveでは以下のように説明されている。
- Default:
trueunless when usingnpm updatewhere it defaults tofalse- Type: Boolean
Save installed packages to apackage.jsonfile as dependencies.
When used with thenpm rmcommand, removes the dependency frompackage.json.
Will also prevent writing topackage-lock.jsonif set tofalse.
リファレンスを読む限り、デフォルトで--save=trueなので
$ npm install {package}
と
$ npm install --save {package}
と
$ npm install --save=true {package}
は同じようだ。--save=trueのときはpackage.jsonに依存性パッケージとしてインストールされるとも書かれている。--save=falseを指定したときはpackage.jsonに依存性パッケージとしてインストールされない。このあたりは次節で実際に動作させてどのような意味なのか確認しよう。
また--save=falseのときはpackage-lock.jsonには書き込まれないともある。この点も実際に動作させて確認する。
動作確認
適当なフォルダを用意する。今回はnode-npm-install-testとした。
$ mkdir node-npm-install-test
このフォルダ内にsaxパッケージをインストールしたりアンインストールしたりして動作確認をする。
saxパッケージを選んだ理由はとくにない。公式のnpm-installのページで例に挙げられていたのでここでも使用した。
npm installとnpm install --saveとnpm install --save=true
最初に下記を実行する。
$ npm install sax
何も入っていなかったフォルダ内にnode_modulesフォルダとpackage.jsonとpackage-lock.jsonが作成される。
$ ls
node_modules package-lock.json package.json
ひとつひとつ中身を確認するとsaxがインストールされていることがわかる。
$ ls node_modules
sax
$ cat package.json
{
"dependencies": {
"sax": "^1.4.1"
}
}
$ cat package-lock.json
{
"name": "node-npm-install-test",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"sax": "^1.4.1"
}
},
"node_modules/sax": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
"integrity": "sha512-(略)",
"license": "ISC"
}
}
}
saxをアンインストールするために下記コマンドを実行する。
$ npm rm sax
removed 1 package, and audited 1 package in 235ms
found 0 vulnerabilities
ちなみにvulnerabilitiesとは脆弱性のことであり、上記の結果はsaxパッケージに脆弱性が見つからなかったことを表している。
実行後にnode_modulesフォルダとpackage.jsonとpackage-lock.jsonの中身をそれぞれ確認すると以下のようになっている。
$ ls node_modules
$ cat package.json
{}
$ cat package-lock.json
{
"name": "node-npm-install-test",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}
saxパッケージがアンインストールされていることがわかる。
記事を短くするために省略するが
$ npm install --save sax
と
$ npm install --save=true sax
の場合も同じ結果になった。
npm install --save=false
さてsaxパッケージをアンインストールしたあと、下記を実行する。
$ npm install --save=false sax
すると下記の結果となった。
$ ls node_modules
sax
$ cat package.json
{}
$ cat package-lock.json
{
"name": "node-npm-install-test",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}
node_modulesフォルダにはsaxがインストールされているがpackage.jsonとpackage-lock.jsonには書き込まれなかった。
まとめ
--saveオプションは依存パッケージとしてインストールするかしないかを表すオプションであり、デフォルトはtrueである。つまり通常はnpm installとnpm install --saveは同じ動作をするのでnpm installを使えばよい
特別な意図があって依存パッケージとしてインストールしたくないパッケージに対しては--save=falseとする。