antd 3升级命令_是时候拥有一个你自己的命令行工具了

本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,创建属于自己的命令行工具。

0. 一分钟体验

首先我们先花一分钟的时间,体验一下创建自己的命令行cli工具是什么感觉。

0.1. 新建项目目录

假如我们的项目名称叫hello-cli,使用如下命令新建项目目录。

mkdir hello-cli && cd hello-cli

0.2. 初始化项目

接下里使用npm-init命令来初始化一个简单的package.json文件。

npm init -y

-y命令表示接受npm的一切默认参数设置。然后替换package.json为如下代码。

{  "name": "hello-cli",  "version": "1.0.0",  "description": "",  "main": "index.js",  "bin": {    "hello": "hello"  },  "scripts": {    "test": "echo "Error: no test specified" && exit 1"  },  "keywords": [],  "author": "",  "license": "ISC",  "dependencies": {    "chalk": "^2.4.2",    "commander": "^2.20.0",    "inquirer": "^6.3.1",    "shelljs": "^0.8.3"  }}

然后使用npm install安装依赖。

0.3. 新建入口文件

在项目根目录下新建名为hello的文件,不需要任何后缀,值得注意的是此时的文件名就是你的cli工具第一个键入的命令,例如npm install,那么hello就等价于npm。并将代码替换如下。

#! /usr/bin/env nodeconst program = require('commander');const inquirer = require('inquirer');const chalk = require('chalk');program  .command('init')  .alias('i')  .description('初始化项目')  .action(option => {    // 该对象用于存储所有与用户交互的数据    let config = {      // 假设我们需要用户自定义项目名称      projectName: null    };    // 使用chalk打印美化的版本信息    console.log(chalk.default.bold('hello v1.0.0'));    // 用于存储所有的交互步骤,例如让用户输入项目名称就是其中一个步骤    let promps = [];    if (config.projectName === null) {      promps.push({        type: 'input',        name: 'projectName',        message: '请输入项目名称',        validate: input => {          if (!input) {            return '项目名称不能为空';          }          // 更新对象中属性的数据          config.projectName = input;          return true;        }      });    }    // 至此,与用户的所有交互均已完成,answers是收集到的用户所填的所有数据    // 同时,这也是你开始操作的地方,这个cli工具的核心代码应该从这个地方开始    inquirer.prompt(promps).then(async (answers) => {      // do something here      console.log(answers);    });  });program.parse(process.argv);

0.4. npm link

那么问题来了,
在你的项目根目录下使用npm link,然后在你本地上就相当于安装了名为hello-cli这样的一个全局npm包了。其原理是将你本地的项目在全局的node_modules中做了一个软链接,拿此项目举例,全局的hello命令已经指向了你的本地目录。如果你想取消测试项目在全局中的映射,同样的进入项根目录,输入命令npm unlink即可。

然后搭配以下命令食用你的第一个cli工具吧。如果报错提示没有权限,在命令前加上sudo即可。

hello init# 或者# hello i

1. commander

commander是一个Node.js环境下的命令行接口解决方案。在上面的一分钟体验例子中,我们用到了command,alias,description,action这四个API。

  • command command代表了这个cli工具向用户暴露的命令行指令。我们还是拿npm install来举例子,command('init')声明了一个叫init的命令,在此处,init等价于install
  • alias alias是对于当前命令行指令的更短的指令。例如大家都知道,npm install可以简写为npm i。i就是定义的alias
  • description description是对当前命令行指令的描述,commander会自动的生成当前cli工具的帮助文档,而该描述就会在hello -h中展示,如果你的一分钟体验项目还在的话,在命令行中输入hello -h就可以看到自动生成的帮助文档了
  • action action是我们注册我们自己回调函数的地方
  • parse parse命令则是解析命令行

下面是一分钟体验项目中没有使用的命令,option。还是举一个例子。如果有用过hexo的应该熟悉这个命令。

hexo new post $YOUR_POST_NAME

没用过也没关系,这个命令是用于创建一个可以自定义名字的Markdown的文档的。大家可能会发现,上面的命令包含了4个单词,而我们的例子中只有两个。那是因为一分钟项目中没有使用commander的optionAPI。

如果你想在hello项目中实现一样的命令,那么只需要在program中调用该API即可。.option('-p, --post', 'add post'),然后就可以通过option参数获取到-p后面,用户输入的参数的值。

2. inquirer

大家也发现了,在命令行输入init命令后,我们需要不停地与命令行进行交互拿到数据,但是在代码里并没有怎么体现,这是因为我们用了inquirer来帮我们做这些事情。

通过inquirer,我们可以实现输入框,获取用户的输入数据,还可以实现选择框。举个例子,用过antd-design-pro应该熟悉创建项目的流程。在命令行中输入命令yarn create umi,在之后的流程中就会出现一个可选择的list。只需要将步骤中的代码替换成如下即可。

promps.push({    type: 'list',    name: 'projectName',    message: '请输入项目名称',    choices: [      {        name: 'ant-design-pro',        value: 'ant-design-pro'      },      {        name: 'dva',        value: 'dva'      }    ]});

在项目中,还使用了validate来对用户的输入数据进行验证,如果不需要验证的话,直接把validate整个代码删除掉就好。

3. chalk

chalk没有什么好介绍的,官网上的文档已经写的很详细了。给大家列一下项目中使用的例子就好。

// 使用默认的字体颜色,加粗字体console.log(chalk.default.bold('hello v1.0.0'));// 打印蓝色的提示信息console.log(chalk.blue('hello v1.0.0'));// 字符串模板用法,在同一行中打印不同样式的信息console.log(chalk`{white.bold [1/3]} ` + chalk`{default.bold Clone project into local path...}`);

4. 最后

如果你厌倦了Node.js写后端,想用Java的Spring Boot来写,但是又担心环境的搭建浪费太多时间。那么你可以试试venus-init(https://github.com/detectiveHLH/venus-init),只需要一行命令便可以快速搭建Java的开发环境。

Happy hacking.

64a307a3d49bb529802edb12e585d03f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找不到要去的声明_老汉将行李袋交由他人看管 去了一趟卫生间找不到人了.........

春节走亲访友难免多喝两杯,但酒后乘车却容易造成财物遗失。目前正值春运返程高峰,从沧州女儿家返程回山东老家的蔡先生就因为中午多喝了几杯酒,便将装有12000元生活费的行李袋弄丢了。好在沧州火车站派出所民警最终将蔡先生的失物找回&#x…

tpcc mysql优化_tpcc_mysql性能测试

. bzr branch lp:~percona-dev/perconatools/tpcc-mysql该方法需要下载bzr工具,还要在网站注册并添加SSH KEY,非常麻烦,并且还没有成功(卡在SSH KEY上)。2. 直接在 http://bazaar.launchpad.net/~percona-dev/perconatools/tpcc-mysql/files …

使用混合多云每个人都应避免的3个陷阱(第3部分)

每天都在肆意宣传云,但每个人都应避免三个陷阱。 从云,混合云到混合多云,您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程,仔细研…

java可视化压缩_web可视化技术发展(1/6)

EverCraft一直在关注Web可视化技术的发展,在本系列文章里,小编将对国外一篇感觉很不错的综述性文章进行翻译,供这一领域的爱好者相互学习。这篇paper的信息为:“Mwalongo, F., et al., State-of-the-Art Report in Web-based Visu…

suse11 rpm 安装mysql_SuSE11安装MySQL5.7.22:RPM安装方式

摘要:SuSE11sp3 64位操作系统、 MySQL5.7.22 rpm安装包5.7版本与先前版本安装有所区别,需要注意注:kingtry是我的主机名一、环境准备操作系统:SuSE版本11sp3,64位kingtry:~ # uname -aLinux kingtry 3.0.76-0.11-defau…

python有多少库存_库存究竟多少才算合理?

本文摘自以上刘宝红老师著作。作为库存计划人员,不管你的库存周转多快,总有人挑战你,说你的库存不合理。不合理,其实是太高的代名词。不过想想看,每一分钱的库存都不是凭空而来,都是为了特定的业务需求而设…

java中iterator_如何在Java中读取CSV文件-Iterator和Decorator的案例研究

java中iterator在本文中,我将讨论如何使用Apache Common CSV读取CSV(逗号分隔值)文件。 从这个案例研究中,我们将学习如何在设计模式的上下文中使用Iterator和Decorator来提高不同情况下的可重用性。 但是在开始之前,我…

屏幕坏点检测图片_电视屏幕出现坏点?行家会这样做!

液晶电视经常会有几个亮点或暗点,这些通常被称为电视坏点。作为强迫症患者,面对这些屏幕坏点我们应该怎么做?下面跟小智聊聊这个问题吧!首先,坏点形成的原因首先是因为液晶屏幕由很多点组成,每个点由RGB三原…

python中int函数的用法浅析_Python中int()函数的用法浅析

int()是Python的一个内部函数Python系统帮助里面是这么说的>>> help(int)Help on class int in module __builtin__:class int(object)| int(x[, base]) -> integer|| Convert a string or number to an integer, if possible. A floating point| argument will be…

Java:GraalVM数据库流性能

GraalVM是JVM块的新成员。 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript。 GraalVM还有一个新的内部代码优化器管道,在某些情况下,与其他JVM相比,它可以显着提高性能。 了解如何…

kubelet启动失败_kubelet 架构浅析

一、概要kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器(PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象…

shell 提取sql 的字段名表名_SQL代码风格规范

作为新时代SQL Boy,大部分时间都是在写sql,很多时候看到别人写的代码实在是不规范,命名随便写,没有缩进,看起来很没有逻辑性,今天分享下我自己的一些规范,从这里修改而来。--名称:xx…

亚马逊ec2 实例删除_亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

亚马逊ec2 实例删除Amazon Web Services提供了12个月的免费使用期限,使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务,其中Web开发人员最关注EC2服务。 EC2是一项服务,通过停止和启动Windows和/或Linux的虚拟实例来提供可调…

carbondata与mysql_Apache CarbonData 1.4.0 中文文档

故障排除本教程旨在为正在构建,部署和使用 CarbonData 的用户和开发人员提供故障排除。当加载数据时,遇到 tablestatus.lock 问题:现象17/11/11 16:48:13 ERROR LocalFileLock: main hdfs:/localhost:9000/carbon/store/default/hdfstable/tablestatus.l…

使用混合多云每个人都应避免的3个陷阱(第4部分)

每天都在肆意宣传云,但每个人都应避免三个陷阱。 从云,混合云到混合多云,您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程,仔细研…

mysql语句使用_Mysql基本使用语句

数据库端口号:Mysql:3306 Orasle:1521 Sqlserver:1443DML: 数据操作语言(检索或者修改数据)DDl:数据定义语言(定义数据结构,比如创建、修改或删除数据库的对象)DCl:数据控制语言(用于定义数据库用户的权限)DML&#xf…

python getattr_Python中的getattr()函数详解:

标签:Python中的getattr()函数详解:getattr(object, name[, default]) -> valueGet a named attribute from an object; getattr(x, ‘y‘) is equivalent to x.y.When a default argument is given, it is returned when the attribute doesn‘texist; without …

python内核死亡的原因_Python的内核由于DLL而死亡

对于机器学习课程,我正在用python做练习。我们的作业必须使用Jupyter笔记本。虽然这在我的笔记本电脑和我的办公桌上运行得很好,但我不能在家里的桌面上运行任何东西。在因为我不确定是否允许我发布给我们的样板代码,我不会这样做。但无论如何…

Java,JavaFX的流畅设计风格拨动开关

嗨,这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来变得非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中,我谈到了切换开…

python登录页面_Python:简单的登陆GUI界面

import tkinterimport sysimport retop tkinter.Tk()top.geometry(‘400x170350150‘)top.wm_title(‘综合实例‘)def validateText():val entry1.get()if re.findall(‘^[0-9a-zA-Z_]{1,}$‘,str(val)):return Trueelse:label3[‘text‘] ‘用户名只能包含字母、数字、下划…