Help us understand the problem. What is going on with this article?

npm でコマンドラインツール開発事始め

More than 3 years have passed since last update.

npm でコマンドラインツール開発事始め

node.js で Gmail API を叩きたい (https://github.com/takayukioda/cmail)
軌跡その2

Gmail をコマンドラインで確認できるツールを作りたい.

開発言語は興味あるけど中々手が出せてなかった node.js で作りたい.

そんなわけで node.js の簡単な使い方を勉強

node.js のインストール

node.js のインストール方法は色々ある

  • 公式ホームページからダウンロードしてインストール
  • Homebrew 等のパッケージ管理ツールからインストール
  • nvm 等の node 用のバージョン管理ツールを利用してインストール

などなど.
自分はバージョンが頻繁に変わるらしいという事で nvm をインストールして,そこから最新版をインストールした.

プロジェクトの作成

Node でプロジェクト情報を package.json に書くのだけども npm init コマンドを打つ事で対話的にプロジェクトの情報を入力できて,その情報を元に package.json を生成してくれる.

聞かれる内容は次の通り

  • name
    • プロジェクトの名称
    • デフォルトでは今いるディレクトリの名前
  • version
    • プロジェクトのバージョン
    • デフォルトでは 1.0.0
  • description
    • プロジェクトの概要
  • entry point
    • モジュールの公開を行っているメインとなる js ソース
    • デフォルトでは index.js
  • test command
    • テスト用のコマンド
  • git repository
    • 公開されている Git のリポジトリ
  • keywords
    • キーワード (npm の検索等で使われるのかな?)
  • author
    • 開発者
  • license
    • 開発物のライセンス
    • デフォルトでは ISC

設定の修正

また今回作るのはコマンドラインツールなので package.json に若干の修正が必要になる.

  • main プロパティの削除
    • このプロパティは他の js でロードされる場合に必要であって,コマンドラインツールでは別の設定が必要
  • preferGlobal プロパティの追加
    • 値は true
    • --global オプションを使ってインストールする事を推奨するオプション
  • bin プロパティの追加
    • { コマンド名: メインjsファイル } で指定
    • main プロパティの代わりにこちらが必要になる

ちなみに自分が参考にしたサイトはこちら: Writing Command Line Tool with Node

これだけでコマンドラインツールのベース完成

プロジェクトの設定をした後に npm link コマンドを実行するとシンボリックリンクが作成されて,一々インストールしなくてもコマンドが使えるようになる.

例えば上で紹介した bin プロパティが以下のような感じだったとすると

{
  "bin": {
    "toolname": "index.js"
  }
}

npm link をした後に

$ toolname

ってしただけでもうコマンドになってる.
想像以上に簡単に設定できて若干腰を抜かしてたりしてなかったり.

以下が1分で作ったシンプルなコマンドラインツール.

da0shi@qiita [~/tmp/samplebox]$ cat package.json
{
  "name": "samplebox",
  "version": "1.0.0",
  "description": "",
  "bin": {
    "samplebox": "main.js"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

da0shi@qiita [~/tmp/samplebox]$ cat main.js
#!/usr/bin/env node

'use strict';

console.log(process.argv);
console.log(process.env.HOME);

da0shi@qiita [~/tmp/samplebox]$ npm link
/Users/da0shi/.nvm/versions/node/v0.12.2/bin/samplebox -> /Users/da0shi/.nvm/versions/node/v0.12.2/lib/node_modules/samplebox/main.js
/Users/da0shi/.nvm/versions/node/v0.12.2/lib/node_modules/samplebox -> /Users/da0shi/tmp/samplebox

da0shi@qiita [~/tmp/samplebox]$ samplebox
[ 'node',
  '/Users/da0shi/.nvm/versions/node/v0.12.2/bin/samplebox' ]
/Users/da0shi

引数と環境変数

引数は process.argv で取得できる.

  • node
  • 実行ソースの場所

が必ず入っているみたい.

環境変数は process.env からアクセス可能.

  • process.env で全ての環境変数
  • process.env.HOME みたいな指定が可能

そんな感じで.

givery
Giveryは社会を豊かにする人々のための成長エコシステムを創造する「成長」支援企業です。ITとリアルの両軸で事業を展開し、お客様・ユーザーの皆様・社員・社会の成長を全力で応援します。
https://givery.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした