之前使用过一些全局安装的NPM包,安装完之后,可以通过其提供的命令,完成一些任务。比如Fis3,可以通过fis3 server start 开启fis的静态文件服务,通过fis3 release开启文件编译与发布;还有vue-cli,可以通过vue init webpack my-project来初始化vue+webpack的项目基础配置。最近有一个需求,需要写一个类似vue-cli的NPM包,通过命令行操作实现项目初始配置,所以就查看了相关资料,学习了一下如何使用node来生成自己的命令。

编写命令行

命令的目标:在当前目录下开启一个静态文件服务,端口号为8085

1.创建目录

构成命令的基础是需要一个命令文件web.js和package.json配置文件,执行以下命令:

$ mkdir node-commander #创建一个文件夹
$ cd node-commander && mkdir bin
$ npm init #初始化package.json文件
$ cd bin && touch web.js #创建命令文件

2.命令文件

#!/usr/bin/env node

var express = require('express');
var path = process.cwd(); function run(argv) {
if (argv[0] === '-v' || argv[0] === '--version') {
console.log('version is 1.0.0');
}
else if (argv[0] === '-h' || argv[0] === '--help') {
console.log('usage:\n');
console.log('-v --version [show version]')
}
else if (argv[0] === '-s' || argv[0] === '--start') {
var app = new express();
app.use('/static', express.static(path));
app.listen(8085, function () {
console.log('server start at port 8085');
});
}
} run(process.argv.slice(2));  

文件的头部务必加入#!/usr/bin/env node这行代码,这里表示使用node作为脚本的解释程序,node的路径通过env来查找,可以避免node安装路径不一带来的问题。

其中process为node进程中的全局变量,process.argv为一数组,数组内存储着命令行的各个部分,argv[0]为node的安装路径,argv[1]为主模块文件路劲,剩下为子命令或参数,如下:

node ./bin/web.js a b c
# process.argv的值为[ '/usr/local/bin/node', '/PATH/web.js', 'a', 'b', 'c' ]

  

3.命令配置

在package.json文件中添加bin字段:

"bin": {
"web": "./bin/web.js"
},  

bin字段的作用:当安装npm包时,npm将添加一条命令/usr/local/bin/web,web命令软连接到web.js文件。

调试命令行

(1)采用install方法

进入npm包目录下,执行全局install,根据package.json中bin的配置,为全局命令创建软连。

 #  sudo npm install . -g
/usr/local/bin/web -> /usr/local/lib/node_modules/cli-demo/bin/web.js /usr/local/lib `-- cli-demo@1.0.0
...

查看web命令

#  which web
/usr/local/bin/web  

执行web命令

#  web --start
server start at port 8085

(2)采用npm link方法

npm link方法创建了两个软连,命令与命令文件的软连,全局包与实际包文件的软连。

# sudo npm link

/usr/local/bin/web -> /usr/local/lib/node_modules/cli-demo/bin/web.js
/usr/local/lib/node_modules/cli-demo -> /Users/baidu/hwm/home/demos/node/node-commander  

接下来可以按照方法(1)进行操作了。

发布命令包

通过npm publish进行发布,前提是有npm帐号。如何操作可以查看npm 官方文档

本文是通过原生node.js来开发命令工具,而vue-cli是采用commander.js来简化命令工具开发,关于commander.js的使用方法,将在下一篇文章中介绍。

  

node.js如何制作命令行工具(一)的更多相关文章

  1. 微软开放技术发布针对 Mac 和 Linux 的更新版 Azure Node.JS SDK 和命令行工具

    发布于 2013-12-04 作者 Eduard Koller 这次为我们使用Linux 的朋友带来了更多关于部署云上虚拟机的消息.今天,微软开放技术有限公司 (MS Open Tech),想与大家分 ...

  2. python制作命令行工具——fire

    python制作命令行工具--fire 前言 本篇教程的目的是希望大家可以通读完此篇之后,可以使用python制作一款符合自己需求的linux工具. 本教程使用的是google开源的python第三方 ...

  3. 基于node和npm的命令行工具——tive-cli

    前端开发过程中经常会用到各种各样的脚手架工具.npm全局工具包等命令行工具,如:Vue脚手架@vue/cli.React脚手架create-react-app.node进程守卫工具pm2.本地静态服务 ...

  4. react.js 之 create-react-app 命令行工具系统讲解

    react.js 教程之 create-react-app 命令行工具系统讲解 快速开始 npm install -g create-react-app create-react-app my-app ...

  5. Nodejs 如何制作命令行工具

    # 全局安装,安装报错是需要前面加上sudo $ sudo npm install -g xxxb # 输出帮助 $ xxxb -h Usage: xxxb 这里是我私人玩耍的命令哦![options ...

  6. Python借助argv和input()制作命令行工具

    命令行执行.py文件并传递参数 代码示例如下,将参数解包 from sys import argv import requests import json import time script, us ...

  7. 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具

    原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...

  8. Gitbook 命令行工具

    1.Gitbook 简介 1.1 Gitbook GitBook 是一个基于 Node.js 开发的命令行工具,使用它可以很方便的管理电子书,GitBook 是目前最流行的开源书籍写作方案. 使用 G ...

  9. node命令行工具—cf-cli

    音乐分享: 钢心 - <龙王> 初喜<冠军>后喜<龙王> (PS:听一次钢心乐队的演出后采访才知道 “龙王”隐喻的是一起喝酒的老铁....) ——————————— ...

随机推荐

  1. scp 命令快速使用讲解

    在 Linux 下使用 scp 命令 scp 是安全拷贝协议(Secure Copy Protocol)的缩写,和众多 Linux/Unix 使用者所熟知的拷贝(cp)命令一样.scp 的使用方式类似 ...

  2. apache用户认证,ssl双向认证配置

    安装环境: OS:contos 6.4 httpd:httpd-2.2.15-59.el6.centos.i686.rpm openssl:openssl-1.0.1e-57.el6.i686.rpm ...

  3. 关于echarts的那些事(地图标点,折线图,饼图)

    前记:离上一篇博客的发布已经过去两个月了,这期间总想写点什么,却怎么都写不出来,一直拖到了现在.现在的感觉,不是像这期间一样,想好好整理一番,写一篇好博客,却写不出来.事实发现,随心就好,较好的博客, ...

  4. linux 内核的rt_mutex 锁操作实现的临界区

    rt_mutex 定义的锁规则: 以偶对齐的task_struct指针为上锁标记, 偶对齐的指针地址最低位用以标记是否有waiters. rt_mutex的trylock,lock,以及unlock都 ...

  5. DDD理论学习系列(1)-- 通用语言

    1.引言 在开始之前,我想我们有必要先了解以下DDD的主要参与者.因为毕竟语言是人说的吗,就像我们面向对象编程一样,那通用语言面向的是? DDD的主要参与者:领域专家+开发人员 领域专家:精通业务的任 ...

  6. Web常见约定规范(精选)

    常见的约定规范 (一)HTML约定规范 1,html属性顺序:id class name data-xxx (src for type href)(title alt)(aria-xxx role) ...

  7. 572. Subtree of Another Tree

    Problem statement: Given two non-empty binary trees s and t, check whether tree t has exactly the sa ...

  8. 在R中整理数据

    原始数据一般分散杂乱,并含有缺失和错误值,因此在进行数据分析前首先要对数据进行整理. 一.首先,了解原始数据的结构. 可使用如下函数(归属baseR)来查看数据结构: class(dataobject ...

  9. Java学习笔记——山西煤老板蛋疼的拉车问题

    小荷才露尖尖角,早有蜻蜓立上头 --小池 这个问题是这样描述的: 山西煤老板有3000吨煤,要运到1000km公里外的地方卖.他选择使用火车来运煤,每辆火车行驶一公里将消耗一吨煤,且火车载货上限为10 ...

  10. 分享一个超级好用的php程序员工具箱

    分享一个超级好用的php程序员工具箱,是由php中文网开发的. 集合了php环境搭建.在线小工具.原生手册.文字与视频教程.问答社区等 (php程序员工具箱 v0.1版本,点此下载:http://ww ...