Node.js で作成した CLI ツールの配布には npmjs.com を使うのが便利です。ツールがオープンソースであれば、 npm publish
コマンドを実行するだけで npm レジストリを経由して簡単に配布することができます。しかしながら、ツールがプライベートである場合はどうしたらいいでしょうか。
この記事では、GitHub のインフラのみを利用してツールを配布する方法を紹介します。
前提条件
以下のツール・サービスを使用します。
- Node.js
- npm
- GitHub のプライベートリポジトリ
- GitHub hub (オプション)
プライベートなリポジトリを作成する
$ mkdir my-cli
$ cd my-cli
$ git init
$ git create -p # or hub create -p
$ npm init -y
GitHub hub は GitHub の CLI ツールです。 hub create
コマンドを使うと、 コマンドラインから GitHub のリポジトリを作成することができます。 -p
オプションはプライベートリポジトリにするオプションですね。
git create
コマンドの代わりに GUI から操作してリポジトリを作成しても問題はありません。
正しく作成されていれば、 リモートリポジトリが参照できるはずです。 username
はあなたのユーザー名に置き換えてください。
$ git remote -v
origin git@github.com:username/my-cli.git (fetch)
origin git@github.com:username/my-cli.git (push)
CLI ツールを作成する
package.json のトップレベルに bin
プロパティを追加し、CLI ツールのプログラムのパスを指定します。また、今回はプライベートであることが前提なので、誤 publish を防ぐための private
プロパティも追加しておきます。
{
...
"bin": "cli.js",
"private": true,
...
}
cli.js
というファイルとして CLI ツールを作成します。
#!/usr/bin/env node
process.stdout.write('Hello!')
process.exit(0)
$ chmod +x cli.js
正しく記述できていれば、 Hello!
と出力する実行可能ファイルができているはずです。
$ ./cli.js
Hello!
GitHub にプッシュしてホスティングする
$ git add .
$ git commit -m"<message>"
$ git push origin master
GitHub から CLI ツールをインストールする
npm コマンドは、 npmjs.com のレジストリ以外からも npm 形式のパッケージをインストールすることができます。 GitHub から上記の自作ツールをインストールするには、以下のコマンドを実行します。username
はあなたの GitHub のユーザー名に置き換えてください。
$ npm install github:username/my-cli --global
/Users/username/.nvm/versions/node/v11.12.0/bin/my-cli -> /Users/username/.nvm/versions/node/v11.12.0/lib/node_modules/my-cli/cli.js
+ my-cli@1.0.0
added 1 package in 15.252s
これで CLI ツールがインストールされました。
$ my-cli
Hello!
ちなみにアンインストールはこんな感じ。
$ npm uninstall my-cli --global
ツールを配布する
上記の GitHub リポジトリはプライベート設定で、アクセス権限がないユーザーは npm install
できません。リポジトリに招待するなどして、アクセス権限を付与することで、限られたユーザーにのみ、npm install
を許可することができます。
アクセス権限の付与が終わったら、ツールをインストールして欲しいユーザーにインストールコマンドを教えましょう。
応用
ツールをビルドする必要があり、かつ、 master
ブランチに自動生成ファイルをプッシュしたくない場合、 CI サービスなどを利用して CD(Continuous Delivery) を行う必要があります。ツールのビルドが必要になるのは例えば以下のような場合です。
- Babel や Polyfill を利用して Node.js の広いバージョンに対応したツールをつくりたい
- webpack などでバンドルして、実行ファイルが 1 つだけの持ち運びしやすい CLI ツールにしたい
CI サービスから、 release
などの名前のブランチにビルド済みのファイルをプッシュするようにすれば、以下のようにツールをインストールすることができます。
npm install github:username/my-cli#release --global
ビルドせずに使う1のでしたら、 Node.js のバージョンを package.json の記述で絞ると良いでしょう。
{
...
"engines": {
"node": ">=8.6.0"
}
...
}
-
async
await
や スプレッド構文{...obj }
などを使いたいですよね? ↩