npm installを人に説明出来ますか?
npmでパッケージ管理をする際に何となくnpm install
を実行しているという方は以外と多いのではないでしょうか。仕事でNode.jsのパッケージを管理することになったのですが、色々と調べていくうちに少しだけ理解が深まったのでまとめたいと思います。
package.jsonとpackage-lock.json
npm install
を理解する上でpackage.jsonとpackage-lock.jsonを知ることは不可欠です。package.jsonにはプロジェクトで使用しているパッケージの一覧が、package-lock.jsonには依存関係(どのモジュールがバージョンも含めてどのモジュールを使っているかなど)の一覧が記述されています。
これらのファイルがあればnode_modulesに格納されるライブラリをGit等で直接バージョン管理しなくても、npm install
やnpm ci
でnode_modulesをすぐに再現出来ます。
npmでパッケージをインストールする際、パッケージを指定する場合と指定しない場合があります。パッケージを指定しない場合はpackage.jsonを参照しながら各パッケージをインストールします。この際package-lock.jsonを更新します。パッケージを指定する場合はそのパッケージのみがnode_modulesにインストールされます。
$ npm install
$ npm install [パッケージ名]
package.jsonに記録する
npm install [パッケージ名]
としてもpackage.jsonに記録は残りません。--save
オプションを付与するとpackage.jsonのdependenciesに追記されていきます。こうすることで次回npm install
をする時にはまとめてインストール・アップデートする対象に含まれるようになります。
$ npm install [パッケージ名] --save
バージョンを固定してpackage.jsonに固定したい場合は--save-exact
オプションを付与します。
$ npm install [パッケージ名] --save --save-exact
これを実行するとpackage.jsonのdependenciesは下記の様になります。^4.17.21
だとlodashパッケージに更新があった場合はマイナーバージョンのアップデートを行うようになります。4.17.21
だと同じバージョンをインストールします。
※--save-exactを付与しない時
"dependencies": {
"lodash": "^4.17.21"
},
※--save-exactを付与した時
"dependencies": {
"lodash": "4.17.21"
},
node_modulesの場所を指定する
サブディレクトリにnode_modulesを作成したい場合は--prefix
オプションでインストール先を指定します。
$ mkdir nodejs
$ mv package.json nodejs/
$ npm --prefix ./nodejs install
ディレクトリ階層は下記の様になります。
$ tree -C -L 2 ?[master]
.
└── nodejs
├── node_modules
├── package-lock.json
└── package.json
既存のnode_modulesからpackage-lock.jsonを作る
$ npm install --package-lock-only
node_modulesしかない時
node_modulesからpackage.jsonを作る場合はまずnpm init
を行い初期状態のpackage.jsonを作成します。そして下記のコマンドを実行します。
$ ls node_modules/ | xargs npm install --save
終わりに
私自身ほんの最近まで他の記事を見ながら何となく実行していたり、その都度てきとうに調べて誤魔化したりして、アプリケーションが動作したらそれでOKとしていました。
今回の経験を通して少しだけでも理解を深められることが出来て良かったです。またこの記事が同じ課題に苦しむ誰かの役に立つことを祈ります。