npmにパッケージを公開してBadgeで華やかに

# まえがき
普段使っているnpmですが、今回はnpmに自分の作ったパッケージを公開するときのやり方とかを調べてみたのでノウハウを残しておこうと思う。
今回は適当なパッケージを作って公開した。

https://github.com/keitarou/calculator.js
https://www.npmjs.com/package/calculator.js

# やったこと

- GitHubのソースコードを公開してnpmに登録した
- Travis.CIでテストを回して、結果をBadgeで公開
- Travis.CIでテストのカバレッジを計測し、結果をCodecovにて集計し、集計結果をBadgeで公開
- Gemnasiumで依存ライブラリのバージョンが最新のものかを確認し、結果をBadgeで公開

結果として、GitHubのREADMEで以下のようなBadgeが付いていることが確認できる
今回は、適当なパッケージでやってみたが、実際に人に使ってもらうことや、協力者を募ることが目的でパッケージを公開する際に、パッケージの評価基準にもなるであるし、揃えておくといいでしょう。
![keitarou_calculator_js_-_Vimperator.png](https://qiita-image-store.s3.amazonaws.com/0/19855/9dbc6c3d-6b44-d1ca-6872-ce5258b9542d.png)

# npmに登録するまで

## npmにユーザー登録

```sh
npm set init.author.name 'username'
npm set init.author.email 'hogetarou@xxx.com'
npm set init.author.url 'https://homepage.com'
npm adduser
```
↑に用にコマンドを実行してnpmにユーザー登録する。
adduserをした際にパスワードを決定することで~/.npmrcができると思う。

## package.json

npmに登録するにあたって必要なメタデータはpackage.jsonに記述することになっている。

今回公開するにあたって入力した内容は以下の用になっている。


```json:packege.json
{
  "name": "calculator.js",
  "version": "1.0.0",
  "description": "npm publish lesson project",
  "main": "index.js",
  "scripts": {
    "test": "mocha",
    "cover": "istanbul cover ./node_modules/mocha/bin/_mocha -- -R spec && cat ./coverage/coverage.json | ./node_modules/codecov.io/bin/codecov.io.js"
  },
  "author": "keitarou <keitarou.oonishi@gmail.com> (https://github.com/keitarou)",
  "license": "MIT",
  "devDependencies": {
    "codecov.io": "^0.1.6",
    "istanbul": "^0.4.1",
    "mocha": "^2.3.4",
    "power-assert": "^1.2.0"
  },
  "dependencies": {
    "lodash": "^3.10.1"
  }
}
```

- name: 公開するパッケージ名
- version: パッケージのバージョン
- description: パッケージの説明
- main: パッケージをrequire()したさいに読み込まれるファイル名。index.js, app.js, パッケージ名.jsとかで名前つけている例が多い気がします。
- scripts: npm run XXX でbatchを実行するためのコマンドを定義する。今回はテストの実行と、カバレッジの計測を登録している
- author: パッケージの公開者情報
- license: パッケージのライセンス
- devDependencies: パッケージの開発するにあたって依存しているパッケージ
- dependencies: パッケージを利用するにあたって依存しているパッケージ

基本的にこれらの情報は
```
npm init
```

のコマンドで半分自動生成できるのでそれに頼ったほうがはやい。
~/.npmrcの内容とかを上手いこと反映してくれる。

## パッケージのソースを書く

```js:index.js
var _ = require('lodash');

module.exports = {
  add: _.curry(function(a, b){
    return a + b;
  })
};
```

今回はこんな感じで書いておいた。

## パッケージを公開する

```sh
git add .
git commit -m 'version 1.0.0'
git tag v1.0.0
git push origin master --tags

npm publish
```

多分、こんな感じで公開できたと思います。
タグ発行して、npm publishすればいいだけ、と覚えておけばいいかと思う。
あとは、npmのサイトで公開したパッケージを確認できればOKかと
https://www.npmjs.com/

# いろいろなBadgeをつける

## npm

http://badge.fury.io/

## Travis.CI

ここから発行できる。
![keitarou_calculator_js_-_Travis_CI_-_Vimperator.png](https://qiita-image-store.s3.amazonaws.com/0/19855/201461f5-56e7-a52e-0b51-65c9268ad2fb.png)
ちなみに、今回Travis.CIを使うにあたって、準備しておいた設定はこんな感じ

```yaml:.travis.yml
language: node_js
node_js:
  - "0.12"
after_success:
  - npm run cover
```
『npm install』『npm run test 』は設定しなくとも、勝手に実行してくれる。

## Gemnasium

SETTINGS -> Badge
で発行できる。

## Codecov

ここから発行できる。

![keitarou_calculator_js_master_-_Vimperator.png](https://qiita-image-store.s3.amazonaws.com/0/19855/9058ca39-1f49-fe50-94b4-e58621088f7d.png)

そもそも、Codecovに関しては使う歩が始めてだったのでちょいとハマった。
Travis.CIを使ってCodecovを利用する文にはAPIキーみたいなものは不要とのこと。
それさえわかってしまえば後は、Codecovのnpmのパッケージに頼ればよしなにやってくれた。
そのへんは、↑のほうで置いている、package.jsonにも書いている。

後はこの辺でかき集めたBadgeをREADMEにでも貼り付けておけばOK。
以前、jewelerを使ってrubygemsにパッケージ公開とかもやってみたことがあるが、npmの方が簡単だなあと思いました。