npmでnodejsのライブラリを作る

空のフォルダを作る

mkdir mytest-package


最小構成
mytest-package/package.json

{
    "name": "mytest-package",
    "version": "0.0.1",
    "main": "./index.js", 
}

mytest-package/index.js

exports.hello = "Hello"

インストール

npm install .

つかってみる

$ node 
> test = require("mytest-package");
> test.hello
Hello

実行コマンドを持ってる場合

npmとかcoffeeみたいな、パッケージに依存したUnixコマンドを作る

mytest-package/package.json

{
    "name": "mytest-package",
    "version": "0.0.2",
    "bin": "./test-bin",
    "main": "./index.js",

}

mytest-package/index.js (同上)

exports.hello = "Hello"


mytest-package/test-bin (chmod +x test-bin)

#!/usr/bin/env node
hello_message = require('./index.js').hello  
console.log( hello_message );


注意:実行名はtest-binではなくnameになります

$ npm install . -g 
$ npm link mytest-package 
$ mytest-package
Hello

実行ファイルに名前をつけたい場合は

{
    "name": "mytest-package",
    "version": "0.0.2",
    "bin": [
          {"test-bin":"./test-bin"}
          ],
    "main": "./index.js",
}

などとします。JSONのArrayで想像できると思いますが、複数の実行スクリプトを登録できます

npmに登録

npm adduser

... 適当にユーザー情報を登録

npm publish

npm install なんとか〜できるようになります(このサンプルスクリプトは登録しないでください)

おまけ

コマンドつくるにあたって、パス周りを調べてて、nodejsのサンプルが少なかったので、よく使うやつをメモ

process.chdir("")

カレントパスを変更
ちなみに ~ は使えないので、process.env["HOME"]などしてホームディレクトリ取得する必要がある

process.argv

コマンドライン引数 [0] が実行プログラム(node) [1]が実行するスクリプトのパス、以降が実行引数

process.env

process.env["HOME"] 環境変数へのアクセス

path.join("a","b"."c",...)

path = require("path");
path.join( process.env["HOME"] , ".profile" ); // #=> /Users/mizchi/.profile など

定数

__filename = process.argv[1] = 実行スクリプトのパス
__dirname 実行スクリプトの含まれるディレクト
ただし、関数の中からは読めない。