コマンドラインで動作する npm ライブラリを作る

`$ npm install -g npm-cli-sample` でインストールできる npm ライブラリを作成していきます。

## npm init

`npm init` で package.json の雛形を作成します。

```bash
$ mkdir npm-cli-sample
$ cd npm-cli-sample
$ npm init

...

package name: (npm-cli-sample)             # そのまま Enter を押すとディレクトリ名になる
version: (1.0.0) 0.0.1                     # version
description: npm cli sample                # 説明
entry point: (index.js)                    # 後で書き換えるのでなんでも良い
test command:                              # 最初はテストいらないのでそのまま Enter
git repository:                            # GitHub などレポジトリがあれば入力
keywords: npm cli sample                   # npm 検索のための keyword
author: star__hoshi                        # 作成者
license: (ISC) MIT                         # ライセンス
About to write to /.../package.json:

{
  "name": "npm-cli-sample",
  "version": "0.0.1",
  "description": "npm cli sample",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "npm",
    "cli",
    "sample"
  ],
  "author": "star__hoshi",
  "license": "MIT"
}
```

## コマンドライン用に修正

cli 用のアプリケーションでは bin の下に `{"コマンド名": "entorypoint"}` と書きます。
package.json は以下のように修正します。

```diff
{
  "name": "npm-cli-sample",
  "version": "0.0.1",
  "description": "cpm cli sample",
- "main": "index.js",
+ "bin": {
+   "npm-cli-sample": "bin/npm-cli-sample"
+ },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "npm",
    "cli",
    "sample"
  ],
  "author": "star__hoshi",
  "license": "MIT"
}
```

## npm i

`npm install` しておきましょう。 node のバージョンによっては package-lock.json が作成されます。

## bin/npm-cli-sample を作成

ひとまずこんな感じで作成。

```js
#!/usr/bin/env node
'use strict'

console.log('Hello World')
```

1 行目は node で動かすために必要、 2 行目はなくても良いけどあった方が良さそうです。
\* [“use strict”（厳格モード）を使うべきか？｜もっこりJavaScript｜ANALOGIC（アナロジック）](http://analogic.jp/use-strict/)

## とりあえず動かしてみる

```bash
$ node bin/npm-cli-sample
Hello World
```

うごいた!

## npm link

```bash
$ npm link
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN npm-cli-sample@0.0.1 No repository field.

up to date in 0.07s
/opt/brew/bin/npm-cli-sample -> /opt/brew/lib/node_modules/npm-cli-sample/bin/npm-cli-sample
/opt/brew/lib/node_modules/npm-cli-sample -> /Users/hoge/git/npm-cli-sample
```

これで npm として利用できる symlink を貼ってくれます。 [link \| npm Documentation](https://docs.npmjs.com/cli/link)

```bash
$ npm-cli-sample
Hello World
```

うごいた!

### 引数を取得する

cli で動くなら引数が必要なので、以下のように動くようにしてみましょう。

```bash
$ npm-cli-sample -n hoge
Hello, hoge!
```

### commandar.js

引数を受け取るライブラリとして、 [tj/commander\.js: node\.js](https://github.com/tj/commander.js) が便利そうなので入れます。

```bash
$ npm i commander --save
```

\* `process.argv` を自力パースする場合はライブラリは不要です。

### bin/npm-cli-sample

```js
#!/usr/bin/env node
'use strict'

const program = require('commander')

program
  .usage('-n yourname')
  .option('-n, --name <value>', 'your name', String, 'World')
  .parse(process.argv)

console.log('Hello ' + program.name + '!')
```

option の第一引数は引数の key, 第二は説明、 第三は型の変換、第四はデフォルト引数です。
第三、第四引数はなくても問題ありません。詳しくは[本家ドキュメント](http://tj.github.io/commander.js/)を。

### 実行

`-h` で help が出せる。

```bash
$ npm-cli-sample -h

  Usage: npm-cli-sample -n yourname


  Options:

    -n, --name <value>  your name (default: World)
    -h, --help          output usage information
```

`-n` で name を指定して実行。

```bash
$ npm-cli-sample -n hoge
Hello hoge!
```

引数なしだとデフォルト引数が利用される。

```bash
$ npm-cli-sample
Hello World!
```

引数を利用することができるようになりました。

## npm publish

npm ライブラリとして公開します。
と言っても Publish する前にユーザ登録が必要です。
https://www.npmjs.com/signup からユーザ登録します。

```bash
$ npm adduser
# user, password, mail など聞かれるので登録した情報を答える
```

そしたら以下で公開。本当に公開されてしまうので注意。

```bash
$ npm publish
```

そしたら `npm -g i npm-cli-sample` で install できるはずです。

## 参考

* [init \| npm Documentation](https://docs.npmjs.com/cli/init)
* [3分でできるnpmモジュール \- Qiita](https://qiita.com/fnobi/items/f6b1574fb9f4518ed520)