導入
初歩的だが「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:
true
unless when usingnpm update
where it defaults tofalse
- Type: Boolean
Save installed packages to apackage.json
file as dependencies.
When used with thenpm rm
command, removes the dependency frompackage.json
.
Will also prevent writing topackage-lock.json
if 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
とする。