LoginSignup
4
8

More than 5 years have passed since last update.

プライベートな CLI ツールを作って GitHub から配布する

Last updated at Posted at 2019-03-22

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"
  }
  ...
}
  1. async await や スプレッド構文 {...obj } などを使いたいですよね?

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8