monorepo工程开发交互nodejs命令行程序

前言

[MixedCli](https://zhangfisher.github.io/mixed-cli/)monorepo应用开发命令行程序提供了一套解决方案,提供了更加友好的命令行开发体验。

第1步:创建工程

以一个典型的monorepo为例开始:


flexapppackagescli     corevuereact

示例工程名为flexapp,工程中的包名分别是@flexapp/core@flexapp/cli@flexapp/vue@flexapp/react

第2步:创建命令行应用

@flexapp/cli是命令行应用,对外提供flexapp的命令行工具。

1. 安装依赖

::: code-group

npm install mixed-cli
pnpm add mixed-cli
yarn add mixed-cli

:::

2. 创建cli.js

@flexapp/cli包中创建cli.js文件,内容如下:

flexapppacakgesclicli.jsinit.jspackage.json

主要内容如下:

::: code-group

const { outputStr,MixedCli } = require("mixed-cli") 
const initCommand = require("./init")const cli = new MixedCli({name: "flexapp",version: "1.0.0",include: /^\@flexapp\//, // 显示logologo: String.raw`____   ____                  __            \   \ /   /___   ___________|  | _______   \   Y   /  _ \_/ __ \_  __ \  |/ /\__  \  \     (  <_> )  ___/|  | \/    <  / __ \_\___/ \____/ \___  >__|  |__|_ \(____  /\/           \/     \/`, 
})
cli.register(initCommand)
cli.run()
{"name": "@flexapp/cli","version": "1.0.0","bin": {"flexapp": "cli.js"}
}

:::

@flexapp/cli仅仅是一个命令行的入口:

  • 重点:include: /^\@flexapp\// 的意思是告诉mixed-cli,当执行flexapp命令时,会在当前工程中搜索以@flexapp/开头的包,然后包中声明在cli文件夹下的所有命令被合并到flexapp命令中。
  • @flexapp/cli中使用cli.register(iniCommand),注册一个通用的init命令,该命令的实现在init.js中。 一般可以在此工程提供一些通用命令,而其他的命令声明逻辑在分别在@flexapp/*/cli/*.js等包中实现。

第3步: 创建命令

从上面可以看到@flexapp/cli非常简单,主要是一些通用的命令和命令行的入口。而真正的命令声明在其他的包中,比如@flexapp/vue@flexapp/react等包中。

然后接下来,我们在@flexapp/vue中创建一个dev命令,用于启用vue项目。

flexapppacakgesclicli.jsdev.jspackage.jsonvuesrcindex.tsclidev.js      // dev命令的实现pacakge.json

接下来我们编写dev.js文件,内容如下:

::: code-group


const { MixedCommand } = require('mixed-cli');/*** @param {import('mixed-cli').MixedCli} cli*/
module.exports = (cli)=>{                const devCommand = new MixedCommand();devCommand.name('dev').description("以开发模式启动应用")      // 未指定默认值,自动使用text类型提供                       .option("-p,--port <port>","指定端口号",3000)                      .option("-d,--debug" ,"调试模式",{ default:true,prompt:true })      .option("-h,--host <host>","指定主机名",{default:"localhost",prompt:true})                         .option("-e,--env [value]","环境变量",{ prompt:false })                                   .option("-m,--mode <mode>","指定模式",{choices:["development","production","test","debug"]}).option("-f,--framework [value]","开发框架",{choices:[{title:"vue",value:1},{title:"react",value:2,description:"默认"},{title:"angular",value:3}]}).option("-o,--open","自动打开浏览器",{prompt:{          // 自定义提示type:"toggle",message:"是否自动打开浏览器?",}}).action((options)=>{            console.log("run dev")})return devCommand
} 

{"name": "@flexapp/vue","version": "1.0.0","main": "index.js","dependencies": {"mixed-cli": "^1.0.0"}
}

:::

  • src/cli目录下创建dev.js文件,用于声明dev命令。cli目录下的所有js文件会被自动加载,每个文件均导出一个函数,该函数需要返回一个或多个MixedCommand实例。cli目录是一个默认的约定目录,可以通过cli.cliDir参数修改。
  • 创建MixedCommand实例,用于声明命令。MixedCommand继承自commanderCommand类,因此可以使用commander的所有特性。
  • package.json只需要将mixed-cli添加为依赖即可。
  • 同样地,我们可以在@flexapp/react,@flexapp/app等包中创建其他的命令。

第4步: 使用命令

我们在flexapp应用中开发。

  • 安装@flexapp/cli

::: code-group

npm install @flexapp/cli @flexapp/vue
pnpm add @flexapp/cli @flexapp/vue
yarn add @flexapp/cli @flexapp/vue

:::

安装@flexapp/cli包后,就可以在命令行中使用flexappflexapp init命令了。

此时执行一下flexapp命令,会看到如下输出:

____   ____                  __
\   \ /   /___   ___________|  | _______\   Y   /  _ \_/ __ \_  __ \  |/ /\__  \\     (  <_> )  ___/|  | \/    <  / __ \_\___/ \____/ \___  >__|  |__|_ \(____  /\/           \/     \/
版本号:1.0.0 
Usage: flexapp [options] [command]Options:-v, --version      当前版本号-h, --help         显示帮助Commands:init [options]    初始化应用  // 只有这个命令 
  • 接下来我们安装@flexapp/vue

::: code-group

npm install @flexapp/vue @flexapp/vue
pnpm add @flexapp/vue @flexapp/vue
yarn add @flexapp/vue @flexapp/vue

:::

此时再执行一下flexapp命令,会看到如下输出:

____   ____                  __
\   \ /   /___   ___________|  | _______\   Y   /  _ \_/ __ \_  __ \  |/ /\__  \\     (  <_> )  ___/|  | \/    <  / __ \_\___/ \____/ \___  >__|  |__|_ \(____  /\/           \/     \/
版本号:1.0.0 
Usage: flexapp [options] [command]Options:-v, --version      当前版本号-h, --help         显示帮助Commands:init [options]    初始化应用  # dev命令是由@flexapp/vue包提供的dev [options]     以开发模式启动应用  //   [!code ++]

第5步: 自动推断交互提示

在上面dev命令中,共指定了6个选项,当执行flexapp dev命令时, 会根据配置自动交互引导用户输入选项,如下:

  • 命令行的交互体验与使用commander时完全一样
  • 仅当选项未指定默认值或满足一定条件时,才会根据一定的规则自动推断交互提示类型。详见自动推断交互提示
  • MixedCli使用prompts来实现交互提示,因此支持prompts的所有交互类型特性。详见prompts

小结

  • MixedCli是一个基于commander的命令行工具开发框架,提供了一套命令行开发的最佳实践。
  • MixedCli能对所有命令行选项自动推断交互提示类型,当用户没有输入选项时,会自动引导用户输入选项,提供友好的用户体验。
  • MixedCli可以在当前工程自动搜索满足条件的包下声明的命令进行合并,从而实现扩展命令的目的。此特性可以保持@flexapp/cli包的精简和稳定,给用户一致的体验。

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

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

相关文章

如何给AVR16芯片解锁

AVRM16核心板本身集成了强大的芯片自解锁功能模块&#xff0c;当由于熔丝位设置错误&#xff0c;导致芯片锁死&#xff0c;无法正常使用时候&#xff0c;可以利用畅学AVR16核心板上的解锁功能给芯片解锁。 &#xff08;如果芯片没有锁死&#xff0c;可以跳过此步骤&#xff09…

ffmpeg解码音频planar模式和packed模式

转载&#xff1a;原文地址&#xff1a; FFmpeg连载4-音频解码-阿里云开发者社区ffmpeg连载系列https://developer.aliyun.com/article/1197520 导读 前面我们介绍了使用FFmpeg解码视频&#xff0c;今天我们使用FFmpeg解码音频。我们的目标将mp4中的音频文件解码成PCM数据&…

python 文本内容随机生成器

这段代码是一个用于生成指定长度的随机文本的函数。主要包括两个函数&#xff1a;generate_text()和generate_other_content()。 generate_text(original_text, length)函数接受两个参数&#xff1a;原始文本和生成文本的长度。该函数的作用是根据原始文本生成指定长度的文本。…

Java异常及网络编程

异常续 throws关键字 当一个方法中使用throw抛出一个非RuntimeException的异常时&#xff0c;就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常&#xff0c;否则编译不通过。 package exception; ​ /*** 测试异常的抛出*/ public clas…

【普中开发板】基于51单片机的简易密码锁设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的简易密码锁设计 1.主要功能&#xff1a;资料下载链接&#xff1a; 实物图&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的简易密码锁设计 ( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.16(有低版本) 程…

vue知识-04

计算属性computed 注意&#xff1a; 1、计算属性是基于它们的依赖进行缓存的 2、计算属性只有在它的相关依赖发生改变时才会重新求值 3、计算属性就像Python中的property&#xff0c;可以把方法/函数伪装成属性 4、computed: { ... } 5、计算属性必须要有…

css的一些属性

我们在写项目的时候&#xff0c;会遇到多种多样的样式&#xff0c;大部分都是由css来实现的&#xff0c;css可以让我们的页面更美观&#xff0c;css通常是配合HTML使用&#xff0c;代码较为简单! 下面我就给大家举几个较为常用的一些css属性。 1.CSS中怎样让元素圆角化&#…

【从零开始学习微服务 | 第一篇】什么是微服务

目录 前言&#xff1a; 架构风格&#xff1a; 单体架构&#xff1a; 分布式架构&#xff1a; 微服务&#xff1a; 总结&#xff1a; 前言&#xff1a; 在当今快速发展的软件开发领域&#xff0c;构建大型应用程序已经成为一项巨大的挑战。传统的单体应用架构往往难以满足…

未完成销量任务的智己汽车突发大规模车机故障,竞争压力不小

2024年刚开年&#xff0c;智己汽车便上演了一出“开门黑”。 近日&#xff0c;不少车主在社交平台发帖&#xff0c;反映智己LS6出现大规模车机故障&#xff0c;包括但不限于主驾驶屏幕不显示车速、档位、行驶里程&#xff0c;左右转盲区显示失效&#xff0c;无转向灯、雷达提醒…

CSS-设置背景图片的大小

要设置背景图片的大小&#xff0c;您可以使用CSS的background-size属性。这个属性允许您指定背景图片的尺寸。 background-size属性可以接受不同的值&#xff0c;包括&#xff1a; auto&#xff1a;保持原始图片的尺寸。cover&#xff1a;将图片缩放到完全覆盖背景区域&#…

ThreadLocal如何使用详解

ThreadLocal概述&#xff1a; ThreadLocal是Java中的一个线程局部变量工具类&#xff0c;它提供了一种在多线程环境下&#xff0c;每个线程都可以独立访问自己的变量副本的机制。ThreadLocal中存储的数据对于每个线程来说都是独立的&#xff0c;互不干扰。 使用场景&#xff1a…

Linux最常用的几个系统管理命令

文章目录 Linux最常用的几个系统管理命令查看网络信息的原初 ifconfig默认无参数使用-s显示短列表配置IP地址修改MTU启动关闭网卡 显示进程状态 ps语法几个实例默认情况显示所有进程查找特定进程信息 任务管理器的 top常规使用显示完整命令设置信息更新次数设置信息更新时间显示…

树莓派非常实用的程序-2 vcgencmd

vcgencmd 工具用于从Raspberry Pi上的VideoCore GPU输出信息。您可以在 https://github.com/raspberrypi/userland/tree/master/host_applications/linux/apps/gencmd[Github].上找到 vcgencmd 实用程序的源代码。要获取支持的所有 vcgencmd 命令的列表&#xff0c;请使用 vcge…

vbs读取数据库值前端FlexGrid前导0出不来的原因

vbs读取数据库值前端FlexGrid前导0出不来的原因 原因 系统设置问题 解决 修改系统默认数值显示&#xff1a; 1&#xff09;控制面板找到“区域”&#xff0c;点击“更改日期、时间和数字模式”&#xff0c;在弹出窗口点击“其他设置” 2&#xff09;在数字一栏中的“显示前…

AirBrush - AI 照片编辑器

​【应用名称】&#xff1a;AirBrush - AI 照片编辑器 ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#AirBrush ​【应用版本】&#xff1a;6.0.1 ​【应用大小】&#xff1a;270MB ​【软件说明】&#xff1a;谁说我们的照片不能完美&#xff1f;我们相信…

前端要了解的k8s、CI/CD、Devops概念

1&#xff0c;了解k8s 简单的理解&#xff0c;k8s就是docker容器集群的管理工具。他将容器进行更多自动化的操作&#xff0c;自动创建、自动重启、自动扩容等&#xff0c;这个过程称为容器编排。 k8s抽象了硬件资源&#xff0c;将N台物理机或云主机抽象成一个资源池&#xff…

Hello 2024

Hello 2024 A. Wallet Exchange 题意&#xff1a;Alice和Bob各有a和b枚硬币&#xff0c;每次他们可以选择交换硬币或者保留&#xff0c;然后扣除当前一枚手中的硬币&#xff0c;当一方没得扣另一方就赢了。 思路&#xff1a;Alice先手&#xff0c;所以当硬币和为奇数时Alice…

java-Exchanger详解

1.概述 java.util.concurrent.Exchanger。这在Java中作为两个线程之间交换对象的公共点。 2.Exchanger简介 Exchanger类可用于在两个类型为T的线程之间共享对象。该类仅提供了一个重载的方法exchange(T t)。 当调用exchanger时&#xff0c;它会等待成对的另一个线程也调用它…

安装pillow遇到的问题

文章目录 引言简介目的 安装Pillow基本步骤 常见问题及其解决方案1. 编译依赖不足描述解决方案 2. 权限问题描述解决方案 3. 版本冲突描述解决方案 4. 安装在错误的Python版本上描述解决方案 5. 操作系统特定的问题描述解决方案 总结 引言 简介 Pillow库是Python的一个开源库…

大学生如何当一个程序员——第三篇:职场软实力

职场软实力 1.职场软实力是什么&#xff1f;2.形象气质和社交礼仪3.声音素质4.情商5.沟通力6.说服力7.说服力之销售8.演讲力9.领导力 文章出自https://www.bjsxt.com/xiulian.html#1F 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xf…