大过年的,要不要写点代码压压惊?来花十分钟学一下怎么通过 NPM 构建一个命令行工具。

写了一个小 demo,用于代替 touch 的创建文件命令 touchme ,可以创建自带“佛祖保佑”注释的文件。效果如下:

命令可以带有一个参数,选择注释的符号

现在,开始撸代码 ~

首先创建一个文件夹,我起名字 create-file-cli 然后通过 npm init 命令创建 package.json 文件。

$ mkdir create-file-cli
$ cd create-file-cli
$ npm init -y

然后修改 package.json 添加一个 bin 字段,定义一个 touchme 命令,并指定该命令执行的文件。

{
"name": "create-file-cli",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"bin": {
"touchme": "bin/touchme.js"
},
"keywords": [],
"author": "",
"license": "ISC"
}

接下来实现 bin/touchme.js ,要用到  Commander.js -- node.js 命令行接口的完整解决方案。看不懂英文文档还有贴心的中文 README

bin/touchme.js 如下

#!/usr/bin/env node

const program = require('commander');
const gen = require('../lib/generate-file'); program
// 版本信息
.version('0.0.4', '-v, --version')
// 用法说明
.usage('<file ...> [options]')
// 选择名 选项描述 默认值
// 选项 可以带有一个参数 可以通过 program.copy 获取该选项信息
// 如果没有参数 该值为 true
.option('-c, --copy <source>', 'copy file and add comment')
.option('-H, --hashtag', `comment by '#'`)
.option('-s, --slash', `comment by '/'`)
.parse(process.argv); function resolve(program) {
// 没有匹配任何选项的参数会被放到数组 args 中
const { copy, hashtag, slash, args } = program;
if (!args.length) {
console.log('Please input filename.');
return;
}
if (copy === true) {
console.log('You should copy at least one file.');
return;
}
let type = 'star';
if (slash) type = 'slash';
if (hashtag) type = 'hashtag';
for (let i = 0; i < args.length; i++) {
gen(args[i], copy, type);
}
} resolve(program);

具体 lib/generate-file.js 实现见 https://github.com/G-lory/create-file-cli/ 就是简单的创建一个文件并写入注释。

通过 option 定义命令选项并可定义参数。

通过 program 可以获取命令行输入的参数信息。

现在功能写完了,剩下的事情就是发布了。首先要到 https://www.npmjs.com 查找一下自己的包名有没有人已经发布了,如果有的话,你需要先修改包名。然后在 https://www.npmjs.com 注册一个账号。记住自己的账号密码和邮箱后,回到命令行。

$ npm login
Username: ...
Password:
Email: (this IS public)
Logged in as ... on https://registry.npmjs.org/.

注意登录成功后显示的是 https://registry.npmjs.org/ 很多同学设置了淘宝的镜像,显示的就不是这个地址,那么发布之前要改回来。

$ npm config set registry=http://registry.npmjs.org

然后就可以发布包了。

$ npm publish

如果之后有修改,更改一下 package.json 中的版本号 然后再次执行 npm publish 即可。

发布后可以去 npm 网站搜索一下自己的包。然后就是安装测试一下功能。

全局安装一下

$ npm install create-file-cli -g

然后就可以使用 touchme 命令创建文件了。也可以使用 touchme -h 来查看帮助。

一个命令行工具就创建成功啦~~

十分钟通过 NPM 创建一个命令行工具的更多相关文章

  1. 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具

    用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...

  2. GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟。

    GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟. 支持输出多种格式 GitBook支 ...

  3. 显示器 Linux 性能 18 (一个命令行工具传递)

    对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并执行是多么的不easy.基于此原因. ...

  4. 【amad】cookiecutter -- 一个命令行工具,使用项目模版来构建项目

    动机 简介 个人评分 动机 一般的框架都有脚手架工具,但是并不会让所有人满意. 简介 cookiecutter1是一个Python实现的命令行工具,可以通过项目模版来构建项目. 它的特性包括: 跨平台 ...

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

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

  6. 如何用Node编写命令行工具

    0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...

  7. Orchard中的命令行工具

    在Orchard中提供了一个命令行工具,我们可以使用这个命令行工具创建用户.创建博客.生成代码.配置网站.打包模块等.并且这个命令行工具是可以扩充的,只要我们在自己开发的模块中创建一个Command类 ...

  8. Apache Commons CLI 开发命令行工具示例

    概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...

  9. [原创]使用命令行工具提升cocos2d-x开发效率(二)之CocosBuilder篇

    如果你正在使用CocosBuilder或者是其他基于CocosBuilder源码改装而成的工具为你的游戏搭建场景或者UI,那你一定要看看这篇文章:)   你是否已经厌倦了无聊的手工publish操作? ...

随机推荐

  1. Caused by: java.lang.IllegalStateException: RedisConnectionFactory is required

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisTemplat ...

  2. restful规范简要概述

    在 RESTful 架构概念详解 中聊了一些概念和约束, 本篇主要简要的聊一聊 RESTful API 规范概要设计, 内容源自 阮一峰老师的博客 一. 协议(protocol) 服务端的 API 与 ...

  3. Aspnet Core 对 Resetful API版本的支持

    在实际项目过程中API往往会收到迭代的影响,同时具备多个版本,因此resetful接口的版本话是非常重要的. 其实官方就提供了很好的支持,微软爸爸在nuget提供了Microsoft.AspNetCo ...

  4. SourceTree推送分支时遇到ArgumentException encountered错误的解决办法

    下载并安装: https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases/tag/v1.17.2 然后重新推送即可 ...

  5. Linux多线程编程,为什么要使用线程,使用线程的理由和优点等

    线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,(http://www.0830120.com)如线程之间怎样同步.互斥,这些东西将在本文中介绍. ...

  6. Hive的DDL操作

    DDL:data definittion language 数据定义语言 主要是定义或改变表的结构.数据类型.表之间的链接和约束等初始化操作 DML:data manipulation languag ...

  7. php 设计模式(转)

    PhpDesignPatterns [PHP 中的设计模式] 一. Introduction[介绍] 设计模式:提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题.设计模式并不一定就是一个 ...

  8. mac中如何卸载pkg包

    ---恢复内容开始--- 参考地址.https://blog.csdn.net/play_fun_tech/article/details/27964861?utm_source=tuicool&am ...

  9. [HEOI2016/TJOI2016]游戏

    Description: 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一 ...

  10. JavaScript(八)

    闭包 什么是闭包 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制收回 function aaa(a){ var b = 5; function bbb(){ a++; ...