Node.jsのパッケージ管理ツールのnpmについて

スポンサーリンク

Node.js のパッケージ管理ができる npm の使い方についてまとめました。パッケージの開発については触れていません。

npmのインストール

npm は Node.js にインストールされています。Homebrew であればbrew install nodeで直接インストールできますが Node.js のバージョン管理ツールであるnvmnodebrewを使いたい場合は以下を参照してください。

Node.jsのバージョン管理ツールであるnvmのインストールと使い方
nodebrewのインストールとコマンドなど使い方まとめ

npm | GitHub の README に記述のあるインストールスクリプトは Node.js 自体がインストールされている必要があります。

npmのアップデート

Node.js にインストールされている npm はバージョンが古いためバージョンを上げるには以下のコマンドを実行します.

$ npm -v
3.10.10
$ npm install npm@latest -g
$ npm -v
5.1.0

パッケージインストール

パッケージをインストールするにはinstallまたはエイリアスのiを使用します。 Warning が表示されていますがpackage.json(この後説明します)が無い状態で実行しているためです。この場合は最新のバージョンがインストールされます。

$ npm install lodash
npm WARN saveError ENOENT: no such file or directory, open '/home/vagrant/npm_test/package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open '/home/vagrant/npm_test/package.json'
npm WARN npm_test No description
npm WARN npm_test No repository field.
npm WARN npm_test No README data
npm WARN npm_test No license field.

+ lodash@4.17.4
added 1 package in 1.731s

インストールしたパッケージはカレントディレクトリ配下のnode_modulesに格納されます。Ruby の Bundler に馴染みがあればグローバルにインストールされると思うかもしれませんがデフォルトはローカルです。

$ tree -a -L 2
.
├── index.js
├── node_modules
│   └── lodash
└── package-lock.json

2 directories, 2 files

インストールしたパッケージを使用するテストスクリプトindex.jsを作成します。

var lodash = require('lodash');

var output = lodash.without([1, 2, 3], 1);
console.log(output);

nodeコマンドでスクリプトファイルを実行しましょう。以下の結果になれば成功です。

$ node index.js
[ 2, 3 ]

requireしたパッケージはどのように読み込まれてるのか気になります。モジュールを探すパスは以下のようになっており、カレントディレクトリから始まりグローバルまでサーチしています。

$ node
> global.module.paths
[ '/home/vagrant/npm_test/repl/node_modules',
  '/home/vagrant/npm_test/node_modules',
  '/home/vagrant/node_modules',
  '/home/node_modules',
  '/node_modules',
  '/home/vagrant/.node_modules',
  '/home/vagrant/.node_libraries',
  '/home/vagrant/.nvm/versions/node/v6.11.0/lib/node' ]
> .exit

CLI ツールなどをインストールした場合はnode_modules/.bin配下に実行ファイルが格納されます。実行する場合は PATH を通す必要があります。

$ tree -a -L 3
.
├── index.js
├── node_modules
│   ├── .bin
│   │   └── bower -> ../bower/bin/bower
│   └── bower
...

install | npm Documentation

グローバルインストール

パッケージをグローバルにインストールするには-gまたは--globalオプションを付けます。

$ npm install -g gulp
/home/vagrant/.nvm/versions/node/v6.11.0/bin/gulp -> /home/vagrant/.nvm/versions/node/v6.11.0/lib/node_modules/gulp/bin/gulp.js
+ gulp@3.9.1
added 185 packages in 18.643s

パッケージ管理

ローカルにインストールされるパッケージを管理するにはpackage.jsonを使用します。npm initを実行すると対話形式で設定する項目を入力する必要がありますが、--yesまたは-yオプションを付けると現在のディレクトリの情報から作成されます。

$ npm init -y
Wrote to /home/vagrant/npm_test/package.json:

{
  "name": "npm_test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

init コマンドで作成される package.json のデフォルト値を設定しておくこともできます。

$ npm set init.author.email "hoge@example.com"
$ npm set init.author.name "tasukujp"
$ npm set init.license "MIT"
$ cat ~/.npmrc
init.author.email=hoge@example.com
init.author.name=tasukujp
init.license=MIT

$ npm init -y
...
  "keywords": [],
  "author": "tasukujp <hoge@example.com>",
  "license": "MIT"
}

package.json を作成した状態でパッケージをインストールするとdependenciesに自動で追加されます。

$ npm install lodash
...
  "dependencies": {
    "lodash": "^4.17.4"
  }
}

install 時に--save-devオプションを使うとdevDependenciesに追加されますが、省略した場合のデフォルトは--save-proddependenciesに追加されます。

package.json が存在している既存プロジェクトを開発する場合などは、npm installのみ実行してください。ファイルに記述されている依存関係をみてパッケージがインストールされます。

init | npm Documentation
package.json | npm Documentation

ここまで触れていませんでしたがnpm installすると生成されるpackage-lock.jsonがある場合、npm installするとファイルに書かれた固定バージョンでインストールされます。

lodashの最新バージョンは4.17.4なので package.json の指定が^4.17.0であればマイナーバージョンの最新を取得してくるはずですが、package-lock.json に従って4.17.0がインストールされます。

// package-lock.json
    "lodash": {
      "version": "4.17.0",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.0.tgz",
      "integrity": "sha1-k/RGblq3PlofEhbDTuoRU18KjfU="
    }

// package.json
  "dependencies": {
    "lodash": "^4.17.0"
  }
$ npm ls
npm_test@1.0.0 /home/vagrant/npm_test
└── lodash@4.17.0

package-lock.json | npm Documentation

パッケージのアップデート

バージョンのアップデートをしたい場合はnpm updateを実行します。package.json のバージョン指定に従って最新バージョンにアップデートされます。その前にnpm outdatedでバージョンの差異を確認してみましょう。

$ npm outdated
Package  Current  Wanted  Latest  Location
lodash    4.17.0  4.17.4  4.17.4  npm_test

$ npm update
+ lodash@4.17.4
updated 1 package in 1.719s

最新のパッケージにアップデートされて package-lock.json のバージョンが更新されました。package.json は変わりません。

// package-lock.json
    "lodash": {
      "version": "4.17.4",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
    }

outdated | npm Documentation
update | npm Documentation

グローバルアップデート

グローバルにインストールしたパッケージのアップデートはインストールと同様に-gオプションを付けます。

$ npm outdated -g --depth=0
$ npm update -g <package>

パッケージのアンインストール

アンインストールはnpm uninstallを実行します。

$ npm uninstall lodash
removed 1 package in 0.314s

package.json の依存関係からも取り除かれています。

  "dependencies": {}

uninstall | npm Documentation

グローバルアンインストール

グローバルにインストールしたパッケージのアンインストールはインストールと同様に-gオプションを付けます。

$ npm uninstall -g gulp
removed 185 packages in 2.139s