勉強メモ/npmの使い方(node.js=v0.11.16, npm=2.3.0, 2015-03時点)

2015-03時点での、npmの使い方の勉強メモ。

```
勉強環境：

$ node --version
v0.11.16

$ npm --version
2.3.0
```

参考：

* https://docs.npmjs.com/
* https://docs.npmjs.com/misc/faq
* `npm help install`
* `npm help root`
* `npm help bin`
* `npm help 5 folders`
* `npm help 7 config`

パッケージインストールの考え方：

* ローカルインストール
    * カレントディレクトリの `node_modules` 以下にパッケージをインストール。
    * 開発プロジェクト固有で依存するパッケージをインストールしたい時に使いやすそう。
* グローバルインストール
    * システム共通の場所にパッケージをインストール。
    * ビルドツールなど、システム全体で利用するツール・コマンド類をインストールしたい時はこっちも便利。

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

ローカルインストールの流れ

1. `npm init` で `package.json` を生成しておく（オプション。開発プロジェクト固有のパッケージインストール前提になるなら、最初にやっておいたほうが良いかも）。
    * 名前, バージョン, 説明, Gitリポジトリ, キーワード, ライセンスなどひと通り聞かれる。全部デフォルトのままにして後から編集しても良い。
1. `npm install パッケージ名` でインストール。
    * デフォルトでカレントディレクトリの `node_modules` 以下にパッケージをインストール。
    * `package.json` に記録しておきたければ、`npm install パッケージ名 --save` を実行。
    * `--save-dev` / `--save-optional` というオプションもある。 `--save` との違いについては後述

ローカルインストールしたパッケージを削除

1. `npm uninstall パッケージ名`
    * `package.json` からも依存関係削除したければ、`npm uninstall パッケージ名 --save(or --save-dev or --save-optional)` を実行。
    * `npm rm` でも一緒。


インストールしたパッケージを確認

1. `npm list (or ls or la or ll)` で、デフォルトだとローカルのパッケージ確認。設定でglobalインストールしたのも確認できるっぽい（今回は試さなかった）。


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

1. `npm install -g パッケージ名`
1. `npm uninstall -g パッケージ名`

# `--save` / `--save-dev` / `--save-optional` の違い

* `--save` は `package.json` の `dependencies` に追記される。
* `--save-dev` は `package.json` の `devDependencies` に追記される。
* `--save-optional` は `package.json` の `optionalDependencies` に追記される。

それぞれの違いだが、package.jsonがモジュールとして外部に公開し、他の人がnpm installした時に影響する。

他の人が npm install した時に、`dependencies` に指定したパッケージが全てインストールされる。

`devDependencies` に追記したものは開発時にのみ使うパッケージを指定するのに使う。そのパッケージの利用者にとっては不要で、開発者のみが使うため、利用者が `npm install パッケージ名` するときはこの依存パッケージはインストールされない。もし `devDependencies` もインストールしたい場合は、`--dev` 設定を有効化(これはnpm installのオプションではなく、 `npm help 7 config` にあるようにnpmの設定である)して、`npm install パッケージ名 --dev` とする。

ただし、利用者がpackage.json含めたソースコード全体をgitなどからcloneして開発する = 開発者と同等の立場として、追加パラメータ無しで `package.json` のあるディレクトリで `npm install` とだけした場合は、開発者の立場になるわけなので、`devDependencies` もインストールされる。というか、依存関係は全てインストールされるらしい。 `--production` つければ、package.jsonのところで `npm install --production` なら `devDependencies` はインストールされない。

`dependencies` と `devDependencies` の使い分けだが、パッケージやプロジェクトが実行時に必要となるのを `dependencies` に設定し、ビルド時だけしか使われないようなビルドツール・ライブラリなどは `devDependencies` に入れておくと良さそう。


`optionalDependenciies` に追記したものは、通常のnpm installでインストールされるが、インストールに失敗してもスルーされる。正直、使いドコロがよくわからない。

他にもdependencyの種類には何種類かあるため、package.jsonのドキュメントを参照のこと。

参考：

* http://stackoverflow.com/questions/19578796/what-is-the-save-option-for-npm-install
* http://stackoverflow.com/questions/18875674/whats-the-difference-between-dependencies-devdependencies-and-peerdependencies
* https://docs.npmjs.com/files/package.json#dependencies


# 各種ファイルのパスについて

```
# 基本的な説明は `npm-folders(5)` 参照
$ npm help 5 folders

# ローカルインストール先のディレクトリ確認
$ npm root

# ローカルインストール先の、コマンドディレクトリ(bin)確認
$ npm bin

# グローバルインストール先のディレクトリ確認
$ npm -g root

# グローバルインストール先の、コマンドディレクトリ(bin)確認
$ npm -g bin
```

# ソースコードを取得した後、package.jsonから依存関係をインストールしたい

```
$ ls
... package.json ...

$ npm install
```

dependencies, devDependenciesが両方インストールされる。devDependenciesを除外したい場合は `npm install --production` とする。