通过自定cli给多个项目添加yml脚本的经验分享
创始人
2024-04-18 15:19:03

背景

上周自己项目组成功使用 gitlab CICD 自动化发版流程,领导叫我复制到其他四个项目组的十几个项目中,相对复制粘贴,是个尝试写工具的好机会。

需求分析

流程分为 runner 和 yml 脚本两部分,runner 已经使用 shared-runner 解决,我的实际需求是能够根据不同配置生成yml脚本的cli工具。

两个概念 + 两个核心依赖 = 自定义cli

概念 bin

package.json 文件中的 bin,指的是如果package中包含希望添加到PATH中的可执行命令,可以提供 bin 来实现映射,本地安装时会安装到项目的 ./node_modules/.bin/,全局会安装在prefix/bin。这也是为什么像下面这种常见的命令,只可以在命令行里敲 npm run dev,而不能敲 vue-cli-service serve --mode development。因为前者实际对应的是 ./node_modules/.bin/vue-cli-service serve --mode development

"scripts": {"dev": "vue-cli-service serve --mode development",
} 

顺带一提可以不用在意的另一个概念

#!/usr/bin/env node 是 shebang 的一个实例:类 Unix 平台上可执行纯文本文件中的第一行,它通过命令告诉系统将该文件传递给哪个解释器执行。简单来说,他帮助文件找到正确的执行器。

核心依赖

首先是 commander。号称完整命令行解决方案,通过更简单的方式,定义-V-help等命令

var program = require('commander');program.version(`${require('../package').version}`, '-v, --version').command('create') // 声明create命令.alias('c') // 声明create命令的别名.description('根据模版创建.gitlab-ci.yml') // --help时显示的描述内容.action(() => {}) // 实际执行操作 

action(() => {})回调的部分,则需要 inquirer

var inquirer = require('inquirer');inquirer.prompt([// 问题列表]).then((answers) => {// 使用收集的选项来做操作}).catch((error) => {}); 

比如我的问题列表包括:

// input类型的输入,其中name表示 .then((answers) => {})里answers的字段
{type:'input',message:'oss地址',name:'ossURL'
},
// 选择 y/n confirm
{type:'confirm',message:'是否需要把结果通知到企业微信(需要企微机器人的webhook key)?',name:'notifyNeed',
},
// 等等 

总的来说,这三步走,实现一个自定义cli。

graph TD
bin字段实现可执行命令 --> commander实现自定命令 --> inquirer实现收集用户配置 

最终结果已经发布在npm,源码在github,如果帮助到你,求个star(图穷匕见)

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...