npm パッケージを作って公開してみた
npm パッケージを Fork して公開してみたいなーと思い、まずはまっさらな状態から npm パッケージを公開するまでの方法を調べた。
ざっくりとした流れは以下のとおり。
- npmjs にユーザ登録する
npm adduser
でログインするnpm init
でパッケージを作る- エントリポイント (
index.js
) の作成 - CLI (
bin/my-module
) の作成 .npmignore
の作成npm publish
で公開する
今回この手順で作ってみたサンプルパッケージは以下。
ついでにこのサンプルパッケージの実装は以下。
では、この手順を詳しく説明する。
1. npmjs にユーザ登録する
まずは npm パッケージを公開している公式のリポジトリである、npmjs でユーザ登録を行う。
「Sign up for npm」から
- Name (任意の名前 : 表示用)
- Public Email (メアド : このアドレスに登録確認メールが飛んでくる)
- Username (スコープ・パッケージに使用されるユーザ名)
- Password (パスワード)
を登録する。
「Username」は npm パッケージの作者として表示される他、「@angular/cli」などのように「@ユーザ名/パッケージ名」という「スコープ・パッケージ」を作る時の「@ユーザ名」部分にあたる。
スコープ・パッケージは、元々プライベートモジュールを有料で扱えるもので、パブリックなパッケージなら無料で使えるようになった。これまでの npm パッケージ名は早い者勝ちだったが、ユーザ名を付与することで名前空間の衝突を避けられるようになった。
登録するとメールアドレスに確認のメールが飛んで来るので、URL にアクセスしてユーザ登録完了。
2. npm adduser
でログインする
続いてターミナルで $ npm adduser
を実行する。ユーザ名とパスワードを聞かれるので入力すると、~/.npmrc
にトークンが追記される。これで npm publish
ができるようになる。
トークン情報はホームディレクトリの ~/.npmrc
である必要はなく、npm パッケージと同じディレクトリに置いた .npmrc
に書いておいても大丈夫な様子。ただしうっかりこのトークンを含んだ .npmrc
を GitHub などに公開しないよう注意。
3. npm init
でパッケージを作る
いよいよパッケージ作成。といっても、普段 npm パッケージを使うプロジェクトで行っているのと同じように、最初は npm init
で始める。
今回はまず GitHub でパッケージ用のリポジトリを作り、それを git clone
してきてから npm init
する。こうすることで package.json
にデフォルトで色々記載してもらえるので楽になる。
$ git clone https://github.com/【ユーザ名】/【リポジトリ名】
$ cd 【リポジトリ名】/
$ npm init
パッケージ名は @【ユーザ名】/【パッケージ名】
という書き方にするとスコープ・パッケージが作れる。npm init --scope=【ユーザ名】
と始めると自動補完してくれる。勿論後から package.json
を手修正して @【ユーザ名】/【パッケージ名】
としても問題ない。
ちなみに、試してみたところ @neos21
というユーザ名と同じパッケージ名では npm publish
することができなかった。スコープ・パッケージのユーザ名部分に付く @
は特殊な解釈を行っているようである。
エントリポイント (index.js
) の作成
まずは package.json
の main
に記載される index.js
を作る。これが、npm パッケージを require()
した時に使えるモノとなる。
今回は、ただユーザ名と URL をコンソール出力するだけのファイルを作ってみた。
// index.js
function Neos21() {
console.log('@neos21');
console.log('http://neo.s21.xrea.com/');
}
module.exports = Neos21;
require()
で使うために module.exports
を忘れないこと。
CLI (bin/my-module
) の作成
次に、グローバルインストールした時や npm run
などで呼ぶ時に実行される、コマンドラインモジュールを作る。
bin/
ディレクトリを作り、コマンド名となるファイル名 neos21
を作ってみる。ユーザ名と URL を出力するだけのコマンドだ。
#!/usr/bin/env node
console.log('@neos21');
console.log('http://neo.s21.xrea.com/');
そしてこれをコマンドラインで呼び出せるようにするため、package.json
に bin
プロパティを追加する。
"main": "index.js",
"bin": "bin/neos21",
.npmignore
の作成
.npmignore
は npm publish
する際に公開しないようにするファイルを設定するもの。.gitignore
があって .npmignore
がない場合は、.gitignore
がそのままリネームされて .npmignore
となって Publish されるようだ。
書き方は .gitignore
と同じで、無視したいファイルやディレクトリを書けば良い。
4. npm publish
で公開する
これでとりあえず完成。おもむろに $ npm publish --access=public
を叩いてみると、あっという間に公開される。スコープパッケージの場合は --access=public
オプションを付けないとプライベート扱いになるためオプション必須。
公開されたパッケージは以下のような URL で確認できる他、$ npm search 【パッケージ名】
で検索して表示されるようになる。
実際にパッケージを使ってみる
それでは実際にパッケージを使ってみる。
まずは適当なプロジェクトでローカルインストールし、index.js
に作った関数を実行してみる。
# パッケージを利用する適当なプロジェクトを作る
$ mkdir test-project && cd $_
$ npm init -y
# パッケージをローカルインストールする
$ npm install @neos21/neos21 --save
# パッケージを呼び出して利用する JS ファイルを作ってみる
$ touch test.js
test.js
ファイルには以下のように実装する。
// パッケージを読み込む
var neos21 = require('@neos21/neos21');
// 読み込んだパッケージの関数を実行する
neos21();
これで出来上がり。Node.js で test.js
を実行してみると、正しくパッケージが読み込まれ、ユーザ名と URL が表示されるだろう。
# パッケージを利用しているスクリプトを実行する
$ node test.js
@neos21
http://neo.s21.xrea.com/
次に、グローバルインストールをしてコマンドラインモジュール (bin/neos21
) を使ってみる。
# パッケージをグローバルインストールする
$ npm install -g @neos21/neos21
# パッケージを実行してみる
$ neos21
@neos21
http://neo.s21.xrea.com/
ご覧のとおり。
これで npm パッケージの作成から公開まではとりあえず試せた。