package.jsonの中身を理解する


## きっかけ
2017/3に[npmモジュールを公開](https://github.com/dondoko-susumu/react-native-card-media)した時に、そのモジュールの[package.json](https://github.com/dondoko-susumu/react-native-card-media/blob/master/package.json)を編集する必要が生じて、今までなんとなくしか理解してなかった各プロパティの意味を調べた。

全てのプロパティを網羅しているわけではない。随時更新していく。

## name
モジュールの名前。必須項目。
ソース内でimportやrequire()でモジュール読み込みで利用される。npmモジュールは`name`と`version`で一意となることが想定されているので、他のライブラリと名前が重複してはいけない。

```json
{ "name": "react-native-card-media" }
```

## version
モジュールのバージョン。必須項目。
npmモジュールは`name`と`version`で一意となることが想定されている。バージョンアップのnpm公開するときは、バージョン番号の更新を忘れないように。

```json
{ "version": "0.0.5" }
```


## private
このプロパティが`true`になっていると、モジュールの公開ができない。公開しないプロジェクトは誤って公開しないように`true`にしておく。

```json
{ "private" : true }
```

## description
モジュールの説明。
`npm search`で表示されるので、人々があなたの作ったパッケージを見つけ、理解するのに役に立つ。

```json
{ "description": "Card Media component for React Native. Also supports multiple image layout." }
```


## main
モジュールの中で最初に呼ばれるスクリプトファイルを指定。
例えばモジュールに`foo`と名前をつけ、それをユーザーがインストールし、`require("foo")`を実行した時に`main`で指定したモジュールのexportsオブジェクトが返される。
パッケージルートからの相対パスを指定しなければいけない。

```json
{ "main": "index.js" }
```

## scripts
任意のshell scriptを実行するエイリアスコマンドを定義できる。

```json
{
  "scripts": {
    "test": "eslint *.js ./components/*.js ./example/*/*.js",
    "start":      "node app.js",
    "production": "NODE_ENV=production node app.js"
  }
}
```
キーは`npm test`、`npm start`のようにエイリアスとして利用できる名前となり、値にはshell scriptをワンラインで指定する。

ただし、`test`や`start`などの予約語以外をエイリアスコマンドとして、登録した場合は`npm run production`と実行する。

ワンラインのshell scriptを記述する際は`dependencies`や`devDependencies`に入っているモジュールの bin は、自動的に PATH に入る。

```json
{
  "devDependencies": {
    "eslint": "^3.18.0"
  }
}
```

と、していれば

```json
{
  "scripts": {
    "test": "node_modules/.bin/eslint *.js"
  }
}
```

ではなく

```json
{
  "scripts": {
    "test": "eslint *.js"
  }
}
```

のように書ける。

`scripts`は、もっとたくさんの機能があるみたいなので、今後追記していきたい。

## repository
ソースコードが管理されている場所を指定する。

```json
{
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/dondoko-susumu/react-native-card-media.git"
  }
}
```

## author
`author` は一人だけを指定し、 `contributors` は複数の人を配列指定する。

このような省略形で書くのが一般的みたいだ。

```json
{ "author": "Ken Kubota <kkbt2003@gmail> (https://github.com/dondoko-susumu/)" }
```

## license
ライセンス情報。

```json
{ "license" : "MIT" }
```

## bugs
プロジェクトの問題やバグ追跡を見る url とそれらの報告を行う email アドレス。
GitHubであればIssueのURLを載せるのが一般的なようだ。

```json
{
  "bugs": {
    "url": "https://github.com/dondoko-susumu/react-native-card-media/issues",
    "email" : "project@hostname.com"
  }
}
```

## homepage
プロジェクトのホームページURL。

```json
{
  "homepage": "https://github.com/dondoko-susumu/react-native-card-media#readme"
}
```

## dependencies
依存するモジュールとバージョンを記述する。
`package.json`が置かれているディレクトリで`npm install`すると、`dependencies`と(`devDependencies`)に記述されたモジュールが`node_module`ディレクトリにインストールされる。

インストールされたモジュールの中にも依存しているモジュールがあれば、それもインストールされる。数珠つなぎのように`dependencies`に記載された依存関係にあるモジュールがインストールされていく。

テストスクリプトを自動実行するようなものやトランスパイラー(リリースモジュールをビルどするためのモジュール)を`dependencies`に書いてはいけない。そういうものは後述する`devDependencies`に記述する。

### --saveオプション

```bash
$ npm install --save co
```

`--save`オプションを付けると、`package.json`に勝手に次のように登録される。

```json
{
  "dependencies": {
    "co": "^4.6.0"
  }
}
```

### バージョンの記法

#### ^ (Caret Ranges)
`--save`オプションで自動で登録されるバージョン指定（`^(カレット)`と呼ぶらしい）

``` 
^1.2.3 := >=1.2.3 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4
```

## devDependencies
npmに公開するモジュールを開発するときに必要なものを定義する。

`devDependencies`に記載されたものは、自分自身が別プロジェクトの外部モジュールとして`npm install`される場合にはインストールされない。

対して、プロジェクトをGitでクローンして`npm install`した場合は、インストールされる。開発時のみに必要なライブラリで、実行時には役に立たないので、含める必要がない。

テストスクリプト、コンパイラ、タスクランナーなど **モジュールとして読み込む際はいらないもの** を定義していく。

ちなみに、エンドユーザとして`npm install`すると`dependencies`と`devDependencies`は両方ともインストールされる。

## jest
package.jsonのトップレベルの`jest`キーで`jest`の設定を書くことができる。

### 設定にpresetを指定
`preset`には`jest-preset.json`をトップレベルでexportsしているnpmモジュールを指定する。

```
{
  "jest": {
    "preset": "react-native"
  }
}
```


## 参考
[公式 npm](https://docs.npmjs.com/files/package.json)
[公式 semver](https://docs.npmjs.com/misc/semver)
[npm package.json 取扱説明書](http://liberty-technology.biz/PublicItems/npm/package.json.html)
[npm-scriptsについて](http://qiita.com/axross/items/a2a0d148e40b66074858)
[ちゃんと使い分けてる? dependenciesいろいろ。](http://qiita.com/cognitom/items/acc3ffcbca4c56cf2b95)
[3分でできるnpmモジュール](http://qiita.com/fnobi/items/f6b1574fb9f4518ed520)
[jest configuration](https://facebook.github.io/jest/docs/configuration.html)