npm installを完全に理解した

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 installnpm 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としていました。

今回の経験を通して少しだけでも理解を深められることが出来て良かったです。またこの記事が同じ課題に苦しむ誰かの役に立つことを祈ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA