当前位置: 首页 > news >正文

构建优雅、高效的 Nodejs 命令行工具 - Archons

目录

    • 项目简介
    • 安装
    • 基本用法
    • 样例
      • 创建一个简单的命令行工具
      • 使用`archons`上下文创建进度条
    • 最后

项目地址: https://github.com/noctisynth/archons
Bug反馈或功能请求:https://github.com/noctisynth/archons/issues

项目简介

Archons意思是“执政官”,我使用Rust作为Nodejs的Native层并将方法通过napi-rs导出到Nodejs,这使得我们可以借助Rust来帮助Nodejs使用者创建高效、强大和优雅的终端命令行工具。

创建这个项目首先是由于citty项目的启发,但是citty很多更高级的功能并不完善,个人感觉社区活跃度也不高,因为我的PR至今没人处理。于是我便想着另起炉灶,但是既然都重写了,为什么不RIIR(Rewrite it in Rust)呢?Rust的命令行工具已经有了一套完整的生态,我们完全可以让Nodejs工具在Rust的肩膀上新生。

于是Archons应运而生。

从本质上来讲,我只是对Rust很多生态例如clapindicatif等库的套壳,但是这的确能够让我们的Nodejs命令行工具更加优雅和强大。我采用类似citty的函数式的声明方式,这能够更加清晰的进行开发。

安装

我们将archons作为开发依赖安装:

  1. 使用npm安装:

    npm install --save-dev archons
    
  2. 使用pnpm安装:

    pnpm add -D archons
    
  3. 使用yarn安装:

    yarn add -D archons
    
  4. 使用bun安装:

    bun add -d archons
    

基本用法

  1. defineCommand 方法

    构建一个基本的命令(或子命令)。

  2. run 方法

    将一个命令作为主命令并运行。

样例

所有样例:https://github.com/noctisynth/archons/tree/main/examples

命令行选项所有可用参数:https://github.com/noctisynth/archons/blob/main/index.d.ts#L66-L210

创建一个简单的命令行工具

Archons 中参数的行为将尽量与 clap 保持一致,部分参数由于Rust与Nodejs的差异,在代码文档中均有标注。

import { defineCommand, run, type Context } from 'archons';// 子命令
const dev = defineCommand({meta: {name: 'dev',about: 'Run development server',},options: {port: {type: 'option',parser: 'number',default: '3000',},},callback: (ctx: Context) => {console.log(ctx); // 这里输出完整的上下文console.log(ctx.args.port) // 这里port的值,缺省值为3000}
})const main = defineCommand({meta: {name: 'simple',version: '0.0.1',about: 'A simple command line tool',styled: true,  // 启用色彩},options: {name: {type: 'positional', // 位置参数required: true, // 必须传入help: 'Name of the person to greet',},verbose: {type: 'option',parser: 'boolean',action: 'store',help: 'Enable verbose output',global: true // 全局参数,会被子命令继承},},// 子命令subcommands: {dev,},callback: (ctx: Context) => {console.log(ctx);}
})run(main) // 执行主命令

使用archons上下文创建进度条

Archons 中进度条的创建行为与 indicatif 一致。

import { type Context, defineCommand, run } from 'archons'const spinner = defineCommand({meta: {name: 'spinner',},options: {'enable-steady-tick': {type: 'option',action: 'store',},},callback: async (ctx: Context) => {const spinner = ctx.createSpinner()spinner.setMessage('loading')spinner.tick()let i = 100const interval = ctx.args.interval as numberif (ctx.args['enable-steady-tick']) {spinner.println('Enabled steady tick')spinner.enableSteadyTick(interval)while (i--) {if (i < 30) {spinner.setMessage('Disabled steady tick for now')spinner.disableSteadyTick()}await new Promise((resolve) => setTimeout(resolve, interval))}} else {spinner.println('Disabled steady tick')while (i--) {spinner.tick()await new Promise((resolve) => setTimeout(resolve, interval))}}spinner.finishWithMessage('✨ finished')},
})const bar = defineCommand({meta: {name: 'bar',},options: {clear: {type: 'option',action: 'store',help: 'Clear the progress bar',parser: 'boolean',},},callback: async (ctx: Context) => {const bar = ctx.createProgressBar(ctx.args.total as number)bar.setTemplate('{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {pos:>5}/{len:5} {msg}')bar.setProgressChars('=>-')let i = 100const interval = ctx.args.interval as numberwhile (i--) {bar.inc(1)await new Promise((resolve) => setTimeout(resolve, interval))}if (ctx.args.clear) {bar.finishAndClear()} else {bar.finish()}console.log('✨ finished')},
})const main = defineCommand({meta: {name: 'progressbar',styled: true,subcommandRequired: true,},options: {interval: {type: 'option',numArgs: '1',default: '100',global: true,help: 'Interval of spinner',parser: 'number',},total: {type: 'option',numArgs: '1',default: '100',global: true,help: 'Total of progress bar',parser: 'number',},},subcommands: {spinner,bar,},
})run(main)

最后

如果你认为这个项目有所帮助,欢迎在GitHub给我一个Star哦!

相关文章:

构建优雅、高效的 Nodejs 命令行工具 - Archons

目录 项目简介安装基本用法样例创建一个简单的命令行工具使用archons上下文创建进度条 最后 项目地址: https://github.com/noctisynth/archons Bug反馈或功能请求&#xff1a;https://github.com/noctisynth/archons/issues 项目简介 Archons意思是“执政官”&#xff0c;我使…...

你喜欢用什么编辑器?

电脑工作者和程序员所使用的文本编辑器通常需要具备高效率、易用性以及对代码友好等特点&#xff0c;包括语法高亮、自动完成、多文件同时编辑、查找替换、版本控制集成等功能。以下是几个广受开发者欢迎且实用性较强的文本编辑器&#xff1a; Visual Studio Code&#xff08;V…...

鸿蒙报错Init keystore failed: keystore password was incorrect

报错如下&#xff1a; > hvigor ERROR: Failed :entry:defaultSignHap... > hvigor ERROR: Tools execution failed. 01-13 16:35:55 ERROR - hap-sign-tool: error: Init keystore failed: keystore password was incorrect * Try the following: > The key stor…...

【Flink】Flink内存管理

Flink内存整体结构图&#xff1a; JobManager内存管理 JVM 进程总内存(Total Process Memory)Flink总内存(Total Flink Memory)&#xff1a;JVM进程总内存减去JVM Metaspace(元空间)和JVM Overhead(运行时开销)上图解释&#xff1a; JVM进程总内存为2G;JVM运行时开销(JVM Overh…...

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1&#xff0c;ZGC&#xff08;JDK21之前&#xff09; ZGC 的核心是一个并发垃圾收集器&#xff0c;所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节&#xff08;TB&#xff09;级内存&#xff0c;设计了基…...

Docker常用命令大全

Docker容器相关命令&#xff1a; 创建并启动容器&#xff1a; docker run&#xff1a;创建一个新的容器并运行一个命令。例如&#xff1a;docker run -d -p 8080:80 nginx这将后台(-d)运行一个Nginx容器&#xff0c;并映射宿主机的8080端口到容器的80端口。 列出容器&#x…...

(12)springMVC文件的上传

SpringMVC文件上传 首先是快速搭建一个springMVC项目 新建项目mvn依赖导入添加webMoudle添加Tomcat运行环境.在配置tomcat时ApplicationContext置为"/"配置Artfact的lib配置WEB-INF配置文件&#xff08;记得添加乱码过滤&#xff09;配置springmvc-servlet文件&…...

在Linux系统中无网络安装Nginx并配置负载均衡

在Linux系统中无网络安装Nginx并配置负载均衡 在现代的Web开发和运维中&#xff0c;Nginx作为一个高性能的HTTP和反向代理服务器&#xff0c;被广泛应用于负载均衡、静态资源服务、SSL终端等场景。然而&#xff0c;在某些特殊环境下&#xff0c;服务器可能无法访问互联网&…...

Android车机DIY开发之软件篇(三)编译Automotive OS错误(1)

Android车机DIY开发之软件篇(三)编译Automotive OS错误(1) 问题 FAILED: out/soong/build.ninja cd “KaTeX parse error: Expected EOF, got & at position 49: …soong_build")" &̲& BUILDER"PWD/KaTeX parse error: Expected EOF, got & …...

基于网络爬虫技术的网络新闻分析【源码+文档+部署讲解】

目 录 1 绪论 1.1 论文研究背景与意义 1.2 论文研究内容 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3系统概要设计 3.1 设计约束 3.1.1需求约束 3.1.2设计策略 3.1.3 技术实现 3.3 模块…...

uniapp区域滚动——上划进行分页加载数据(详细教程)

##标题 用来总结和学习&#xff0c;便于自己查找 文章目录 一、为什么scroll-view?          1.1 区域滚动页面滚动&#xff1f;          1.2 代码&#xff1f; 二、分页功能&#xff1f;          2.1 如何实现&#xff…...

机器学习(1):线性回归概念

1 线性回归基础 1.1 什么是线性 例如&#xff1a;汽车每小时60KM&#xff0c;3小时可以行使多长距离&#xff1f;已知汽车的速度&#xff0c;则汽车的行使距离只与时间唯一相关。在二元的直角坐标系中&#xff0c;描出这一关系的图是一条直线&#xff0c;所以称为线性关系。 线…...

关于编写测试用例的细枝末节

这里写目录标题 故障判别类-边界考虑示例1.0&#xff1a;若A&#xff1e;20.3且持续时间≥15ms时&#xff08;判故周期为1000Hz&#xff09;&#xff0c;输出B为1&#xff0c;否则输出B为0。 故障判别类-不可恢复测试示例1.1&#xff1a;若A&#xff1e;20.3且持续时间≥15ms时…...

《计算机网络》课后探研题书面报告_了解PPPoE协议

PPPoE协议的工作原理与应用分析 摘 要 PPPoE&#xff08;Point-to-Point Protocol over Ethernet&#xff09;是一种广泛应用于宽带接入的网络协议&#xff0c;特别是在DSL&#xff08;数字用户线路&#xff09;和光纤网络中具有重要的应用价值。PPPoE结合了PPP协议的认证、加…...

Linux Centos 安装Jenkins到服务

一、前言 假设你已经下载了jenkins.war 安装了对应的jdk&#xff0c;下面我们来安装jenkins&#xff0c;以服务的形式安装。 二、安装 1&#xff09;将jenkins.war拷贝到合适的位置&#xff0c;我的位置 /u01/jenkins/ &#xff0c;位置你自己选。 2&#xff09;创建系统用户…...

解决“无法定位程序输入点 av_buffer_create 于动态链接库 XXX\Obsidian.exe 上”问题

解决“无法定位程序输入点 av_buffer_create 于动态链接库 XXX\Obsidian.exe 上”问题 问题描述 本人在使用zotero中的zotero one&#xff08;青柠学术插件&#xff09;的时候&#xff0c;使用插件跳转obsidian中的对应笔记&#xff0c;出现上图情况。&#xff08;错误中提到的…...

基于考研概率论知识解读 Transformer:为何自注意力机制要除以根号 dk

Transformer自注意力机制中除以 d k \sqrt{d_k} dk​ ​深度剖析 【 Transformer 系列&#xff0c;故事从 d k \sqrt{d_k} dk​ ​说起】 LLM这么火&#xff0c;Transformer厥功甚伟&#xff0c;某天心血来潮~&#xff0c;再去看看&#xff01; 它长这个样子&#xff1a; 深入…...

网络安全学习81天(记录)

前言&#xff1a; 小迪安全&#xff0c;81天&#xff0c;开始了php代码审计 思路&#xff1a; 内容&#xff1a; #知识点&#xff1a; 1、审计漏洞-SQL 数据库注入挖掘 1、审计思路-正则搜索&功能追踪&辅助工具 3、审计类型-常规架构&MVC 架构&三方框架 #章…...

MATLAB学习笔记-table

1.在table中叠加table table 的每一列具有固定的数据类型。如果要让表的所有单元格都可以任意填充&#xff0c;就得让每一列都是 cell 类型&#xff0c;这样表中每个单元格都是“一个元胞”。创建时可以先构造一个 空 cell 数组&#xff08;大小为行数列数&#xff09;&#x…...

mybatisPlus(条件构造器API)

文章目录 目录一、mybatisPlus的介绍二、mybatisPlus的基础使用配置BaseMapper的基本CURD&#xff08;增删改查&#xff09; 三、wrapper&#xff08;条件构造器&#xff09;条件构造器&#xff08;wrapper&#xff09;通用API基础条件判断&#xff1a;进阶条件判断&#xff08…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...