如何手动写一个命令行工具?

DSP28377D双核烧:从手动调试到自动化部署的演进之路 本文详细介绍了DSP28377D双核烧手动调试到自动化部署的演进过程。通过分析双核架构特性,探讨CCS工具的多核烧配置、自动化脚本集成及生产部署策略,帮助工程师实现高效一键烧,显著提升开发效率并降低人为错误风险。 阅读详情


前言

如何手动写一个命令行甚至说发布一个npm包,这涉及到所需要提供服务的接口和优雅的命令行外观,本文将分为两部分去介绍构建命令行工具的方法。


提示:以下是本篇文章正文内容,下面案例可供参考

一、一个最简单的命令行工具

如何在命令行中输入一条命令,使它返回一句话?
首先我们需要建立一个文件夹,并在文件夹中npm init,建立一个index.js文件,在该文件中编写主要逻辑代码。

#!/usr/bin/env node
console.log('hello,world!')

/usr/bin/env就是告诉系统可以在PATH目录中查找。 所以配置#!/usr/bin/env node, 就是解决了不同的用户node路径不同的问题,可以让系统动态的去查找node来执行你的脚本文件。

要不要加–harmony?
文档里这么说,windows下不支持这么做。这个写法一般用于一些子命令的脚本中。

Use #! /usr/bin/env node --harmony in the subcommands scripts. (Note Windows does not support this pattern.)
Use the --harmony option when call the command, like node --harmony examples/pm publish. The --harmony option will be preserved when spawning subcommand process.

修改package.json

{
  "name": "mycli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "bin":{
    "hi":"./index.js"
  },
  "license": "ISC"
}

二、命令行解析工具

1.commander

文档地址:https://www.npmjs.com/package/commander

(1)option

Options are defined with the .option() method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar (’|’).

意思是可以这么使用options的第一个参数,简写和完整形式之间可以用逗号,空格和‘|’连接。

program
	.option('-u, --username <username>', 'The user to authenticate as')

The two most used option types are a boolean option, and an option which takes its value from the following argument (declared with angle brackets like --expect ). Both are undefined unless specified on command line.

如果没有传参每个option返回的是一个布尔值,用于判断该option是否被执行;如果有传参,在定义时需要加上<>来进行参数传递。

The parsed options can be accessed by calling .opts() on a Command object, and are passed to the action handler. Multi-word options such as “–template-engine” are camel-cased, becoming program.opts().templateEngine etc.

如这段代码所示调用program的opts()方法可以对options进行一些逻辑判断,从而给每个option不同的方法,注意option如果碰到一长串字符的选项会自动变成驼峰命名,在opt方法中调用参数的话,需要用模板字符串来返回。

var co = require('co');
var prompt = require('co-prompt');
var program = require('commander');
program
  .option('-d, --debug', 'output extra debugging')
  .option('-s, --small', 'small pizza size')
  .option('-p, --pizza-type <type>', 'flavour of pizza');

program.parse(process.argv);
const options = program.opts();
if (options.debug) console.log(options);
console.log('pizza details:');
if (options.small) console.log('- small pizza size');
if (options.pizzaType) console.log(`- ${options.pizzaType}`);

如果没有设置默认值的话,控制台会返回这样的结果,C:\Users\15905\mycli>hi -p error: option '-p, --pizza-type <type>' argument missing,所以我们可以在option里面增加参数,使得他有一个默认的返回值。

program
  .option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');
program.parse();
console.log(`cheese: ${program.opts().cheese}`);

增加一些option

program
  .addOption(new Option('-s, --secret').hideHelp())
  .addOption(new Option('-t, --timeout <delay>', 'timeout in seconds').default(60, 'one minute'))
  .addOption(new Option('-d, --drink <size>', 'drink size').choices(['small', 'medium', 'large']));

也可以在action中对options进行判断

program
  .arguments('<name>')
  .option('-t, --title <honorific>', 'title to use before name')
  .option('-d, --debug', 'display some debugging')
  .action((name, options, command) => {
    if (options.debug) {
      console.error('Called %s with options %o', command.name(), options);
    }
    const title = options.title ? `${options.title} ` : '';
    console.log(`Thank-you ${title}${name}`);
  });

(2)version

program.version('0.0.1');

(3)command

和-option有些像,可以将它的参数传入action,因此逻辑可以在action里面处理。
如果和-option卸载一个段落,option会作为他的子命令出现。

program
  .command('clone <source> [destination]')
  .description('clone a repository into a newly created directory')
  .action((source, destination) => {
    console.log('clone command called');
  });
  program.parse();

(4)argument

在当前command下添加传入参数,假设有两个参数,一个是username,另外一个是password,第一个参数是必须要填的(否则不能判断第二个参数是那个),第二个参数可不填且有默认值。

program
  .version('0.1.0')
  .arguments('<username> [password]')
  .description('test command', {
    username: 'user to login',
    password: 'password for user, if required'
  })
  .action((username, password) => {
    console.log('username:', username);
    console.log('environment:', password || 'no password given');
  });
  program.parse()

输出如下

C:\Users\15905\mycli>hi
error: missing required argument 'username'

C:\Users\15905\mycli>hi 'mouziyao' '123456'
username: 'mouziyao'
environment: '123456'


C:\Users\15905\mycli>hi 'mouziyao'
username: 'mouziyao'
environment: no password given

C:\Users\15905\mycli>

2.co-prompt

文档地址:https://www.npmjs.com/package/co-prompt
通过这个依赖更好的实现了登录逻辑,异步获得了账户名和密码,prompt和prompt.password API可以调用并返回值,password提供了不显示具体数字的功能。

#!/usr/bin/env node
var co = require('co');
var prompt = require('co-prompt');
var program = require('commander');
program
    .version('0.0.2')
    .arguments('<file>')
    .option('-u, --username <username>', 'The user to authenticate as')
    .option('-p, --password <password>', 'The user\'s password')
    .action(function(file){
        co(function *(){
            var username = yield prompt('username: ');
            var password = yield prompt.password('password: ');
            console.log('user: %s password: %s file: %s',
                username, password, file);
        });
    })
    .parse(process.argv);

三、命令行美化提示依赖

1.readline

2.chalk

3.figlet

四、发布一个npm包

1、执行get registry

npm config get registry https://registry.npm.taobao.org/

2、配置本地仓库

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

3、执行npm adduser

4、执行npm publish

5、执行成功

在npm官网的个人资料中能查看到发布的包

6、最后记得将本地仓库还原

npm config set registry=https://registry.npm.taobao.org/

总结

以上是手写命令行工具和发布的流程,对文档进行了一点解读,也动手制作了一个npm包,仅作参考。

告别反复格式化!用Ventoy制作2025年终极启动盘,Windows/Linux/macOS一网打尽 本文详细介绍了如何使用Ventoy制作2025年终极多系统启动盘,彻底告别反复格式化U盘的烦恼。Ventoy通过创新的引导加载器架构,允许用户在一个U盘内同时存放并直接启动Windows、Linux、macOS等多种系统镜像和WePE等维护工具,实现真正的非破坏性管理和极高的U盘利用率。文章涵盖从安装配置、镜像库构建到安全启动设置等全流程实战指南。 阅读详情

相关推荐

移植Google Gemini Nano到RK3588 NPU,实现高效边缘推理

在嵌入式 AI 开发中,大家常常会遇到模型在硬件平台上运行时出现性能瓶颈的问题,比如推理速度慢、功耗过高,这严重影响了应用的实时性和稳定性 ,导致性能瓶颈,无法满足如智能安防、工业检测等场景的实时性需求。为了解决这些问题,我们可以将轻量模型移植到具有强大算力的硬件平台上。本文将手把手教你将 Google Gemini Nano(或类似轻量模型)移植到 RK3588 NPU,充分发挥 RK3588 NPU 的 6Tops 算力,实现高效的模型推理,提升嵌入式系统的 AI 处理能力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 251

如何编命令行运行的程序

关闭 Web 容器 控制依赖 最简单办法是 不添加 Web 相关依赖 配置方式 spring.main.web-application-type=none 关闭web应用程序的一个支持 编程方式 SpringApplication • 设置 setWebApplicationType() 为none SpringApplicationBuilder • 设置 web() 为no...

weixin_43790623的博客 1489

Winmail 4.7破解版

Winmail 4.7破解版,内附破解说明,Winmail 4.7破解版

使用Go编命令行工具:实例与设计模式

1.背景介绍 使用 Go 编命令行工具:实例与设计模式 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 Go 语言的兴起 Go 语言是 Google 开发的一种静态类型、编译型的语言,自 2009 年以来已经成为越来越多开发者的首选语言。Go 语言具有简单易学、高效运行、丰富的库函数等特点,特别适合用来开发服务器端应用、网络编程、数据处理等领域。 1.2 命令行工具的重要性 ...

AI天才研究院 1540

30天自制操作系统——第十七天制作命令行窗口

今天的任务是制作命令行窗口,那么命令行窗口应该是什么样呢? 在Windows系统里我们都使用过命令行窗口,它首先是黑底的,可以在里面输入各种字符、可以对输入的命令进行响应… 由于命令行窗口的制作用到的都是之前的知识点,难度并不大。由于修改的代码量较大,篇幅有限,就不把代码粘贴上来了,有兴趣的同学可以自行下载阅读。 这里主要记录一下制作命令窗口的关键步骤(本节没有什么新的知识点,可以直接跳过): 一、绘制命令行窗口 我们先在HariMain函数中画出一个命令行窗口的样子,命令行窗口一般就是黑底白字,可以对输入

mint1993的专栏 5271

如何打造一个属于自己的命令行工具

平常经常使用一些npm cli工具,你是否好奇这些工具又是怎么开发出来的呢?接下来这篇文章,就会介绍如何利用Node.js开发一个属于你自己的命令行工具。 创建基础的文件目录 首先,我们需要先创建一个基本的项目结构: mkdir git-repo-cli cd git-repo-cli npm init #初始化项目 接着我们创建所需的文件: touch index.js mkdir lib cd lib touch files.js touch github_credentials.js

Haines 1597

Python知识点:如何使用Python开发命令行工具

使用 Python 开发命令行工具一个非常实用的技能,能够简化日常工作流程并自动化常见任务。选择合适的库argparse适合简单工具,click则更加灵活。命令行参数解析:通过定义位置参数和可选参数,让用户可以方便地提供输入。提供帮助和文档:确保工具有完善的帮助信息,通过--help命令展示。打包工具:通过setuptools打包工具,使其可供他人使用。通过这些步骤,你可以轻松开发和发布自己的命令行工具,提高工作效率。

杰哥在此的专栏 1726

通过npm一个cli命令行工具

前言 如果你想一个npm插件,如果你想通过命令行来简化自己的操作,如果你也是个懒惰的人,那么这篇文章值得一看。 po主的上一篇文章介绍了定制自己的模版,但这样po主还是不满足啊,项目中我们频繁的需要新建一些页面,逻辑样式等文件,每次都手动new一个,然后复制一些基本代码进去非常的麻烦,所以就有了这篇文章。接下来就让po主为大家一步一步演示怎么做一个npm命令行插件。 注

程序员小叶的博客 1083

java命令行交互_从头一个Java命令行的交互式菜单

为什么?由于工作需要,正在学Antlr,自然作者的那本经典《The Definitive ANTLR 4 Reference》是必读的。边读边代码是程序员的常规看书姿势,我也不例外。不过习惯IDE了(Antlr每次都生成一堆堆代码,IDE下看还是不错的),来回命令行和IDE切换很是费事,所以打起了命令行下交互式菜单的主意。可惜google了一圈,没现成的。好吧,那就撸起袖子做一个吧。项目在g...

weixin_29603829的博客 519

手动通过grub命令行启动Linux或者win系统

手动通过grub命令行启动Linux或者win系统前些天fedora的启动菜单grub.conf丢失,无法进入系统。不过,grub启动管理器还好好的,只好通过grub命令行手动引导启动系统了。  在“从硬盘安装fedora 8”中曾经稍微提到过,grub是一个多系统的启动管理器,不但有linux版本的grub,也有windows版本的grub。上次从硬

ilyc157的专栏 3457

【bash编命令工具

使用bash编代码,实现一个命令行工具,使用I/o重定向的方式将命令列表提供给用户,替代交互式程序,避免脚本开发人员使用临时文件来构建输入信息。欢迎关注微信公众号:数据科学与艺术 作者WX:superhe199。因此,请确保输入的命令列表是可信的,并注意潜在的安全风险。注意,在这个例子中,每行输入都会被解释为一个单独的命令,并被。将上述代码保存为一个可执行的文件,比如。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 501

每日一课 | 如何编完美的Python命令行程序?

作者 |Yannick Wolff译者 |弯月作为 Python 开发者,我们经常要编命令行程序。比如在我的数据科学项目中,我要从命令行运行脚本来训练模型,以及计算算法的准确率等。...

sinat_32849897的博客 418

创建自己的Net Tool(一个自己的命令行CLI工具

创建一个自己的命令行工具,方便装X,当然也会方便你的工作。不信你来看看!

iml6yu的博客 438

掌握命令提示符(CMD):Windows命令行工具的基本指南

CMD是Windows操作系统自带的命令行解释器,它允许用户直接在命令行中输入命令并执行相应的操作。CMD提供了丰富的命令集,可用于文件和文件夹管理、系统配置、网络管理、进程控制等各种任务。通过CMD,用户可以自动化任务、批处理文件、进行系统调试等。2. CMD的基本用法。

weixin_65175398的博客 1902

NPM 制作命令行工具 - 入门案例

经常通过npm安装vue-cli之类的命令行工具,那么如何简单的制作一个命令行工具呢?只需要几步即可!

卡尔特斯 1099

手把手教你命令行工具

命令行工具,即 Cli(command-line interface)。是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。在学习这篇教程之前,你需要先了解NodeJs,NPM和一些常用的shell命令! 对于前端开发者来说,用NodeJs开发命令行工具是最方便和快速的,借助于 npm,可以方便的进行调试和发布。 NodeJ...

w13707470416的博客 273

CMD命令行基础

一、基本命令 Windows 中有两种命令:内部命令和外部命令。内部命令即内置在命令行解释器中的命令,不需要额外的程序,如 dir 、copy 等。外部命令是以可执行文件的形式(扩展名通常为 exe 或 com)存在于磁盘上,这就意味着该程序必须存在,否则 Windows 是找不到该命令的,如 format.com 。 每条命令输完后须回车,方开始运行,并得到运行结果。命令行解释器把提示符“>”和回车键间的字符串视为一条命令。如果这字符串确实符合 Windows 命令语法,就执行它,执行完后...

u011250186的博客 1305

用Python做一个CMD命令 很简单我教你自己做一个命令行!

目录 使用简介 运用到的库 1.click库 2.作者自己的库 正式开始 hello.py winOS.py 添加变量环境 使用简介 大家好我是PYmili ! 大家都应该会CMD命令吧! 什么你不会? 看连接:CMD命令大全 大家肯定跟我一样,懒得记!那我就想到自己用python做一个命令行呗!有想法一样的朋友点个赞!谢谢! 运用到的库 1.click库 click:官方github连接 翻译官方介绍为: 用于以可组合的方式创建美丽的指挥线接口,只需尽...

PYmili的博客 6765

命令行工具-fire

命令行工具,即Cli(command-line interface)。是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。 Windows上的自带的命令行工具,就是我们最常接触的cmd 在python中,我们可以运用python的fire模块轻松编命令行工具。fire会对当前对象结构进行暴露,将结构信息映射到shell命...

棠牧师的博客 627

开始命令行

开始命令行版 GUI版本虽然操作方便,但容易被恶意程序影响 所以还得弄个命令行的版本备用

Purpleendurer@CSDN 1176
上一篇: React框架原理
下一篇: 力扣每日一题:208. 实现 Trie (前缀树)
kkkokra
博客等级 码龄7年 4粉丝 16原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值