uibot在子程序执行js失败_使用 Node.js 将珍藏的 bash 脚本封装成命令行工具

阐述如何将一个常用的 bash 脚本融入 npm 生态之中,此处以最近遇到的一个 CR 提交脚本为例。

背景

作为程序猿,大家或多或少地都用过 GitHub 上的 merge request 功能。当然,除了这类 Code Review 方式,不少公司都有自己的 Code Review 平台,我司也不例外,我们使用了类似 Gerrit 的工具,此处我们暂且以 Gerrit 指代。由于最近在治理工程时,需要全面切(要)到(求)使用 Gerrit 进行 CR 提交。发现 Gerrit 提交命令不是那么好记,经常需要先 git push,接着被拦截报错之后,再根据提示复制命令行,再次执行方可成功提交 Gerrit 。作为攻城狮,这有点难以忍受了!!!

诉求

一、有没有单独的命令让我直接提交 Gerrit?

二、有没有命令行工具,我直接安装就能使用?

三、在 git push 后,经由 git hook 拦截后按需提交 Gerrit?

解决

一、有没有单独的命令让我直接提交 Gerrit?

答:有的,有次同事见我提交 Gerrit 不顺畅,转发了一个 bash 脚本给我:『你把它复制到 /usr/local/bin 目录下,就能直接使用 gerrit 执行了』。珍藏脚本如下(gerrit):

bash branch=$(git symbolic-ref --short -q HEAD)
git push origin HEAD:refs/for/${branch}

二、有没有命令行工具,我直接安装就能使用?

答:有的,既然都有脚本了,作为前端开发,必须用心爱的 Node.js 封装一个命令行工具,只需两步即可使用:首先执行 npm i @dd/gerrit-cli -g ;接着在工程目录下执行 gerrit 即可使用。

三、在 git push 后,经由 git hook 拦截后按需提交 Gerrit?

答:有的,如果你还觉得全局安装命令行太麻烦,或者害怕新人来了一脸懵逼。那么,还可以借助 git hook 进行拦截,用户只需要『无脑地』执行 git push 即可。当然前端这块有现成的 git hook 神器,它就是人见人爱的哈士奇,至于其它语言生态,大家找找应该有的。

我们来看看如何封装上述脚本吧!

实现方式

1. 配置命令

如何能让别人安装你的 npm 包时,就能在终端中执行命令行呢?只需对你的 npm 包的 package.json 添加 bin 字段:

{"name": "your-first-cli-package","version": "1.0.0","description": "你的第一个命令行工具","main": "index.js","bin": {"yourCommand": "index.js"},
}

之后别人使用 npm i -g your-first-cli-package 时,即可在终端中执行 yourCommand 调用你的 index.js 的逻辑啦。如果使用局部安装的方式,即 npm i your-first-cli-package,命令行将被安装到 node_modules/.bin/yourCommand 下,其内容正是 index.js 的内容。此时可编辑 npm scripts 调用。

2. 调用声明

由于我们使用 Node.js 实现,因此命令行对应的入口 js 文件(此处即 index.js)需要声明当前文件使用 node 执行:

#!/usr/bin/env node
// 此处编写 yourCommand 命令的逻辑

3. 编写逻辑

此处实现得比较粗糙,目前就一个命令,因此未引入 args 这类包。

#!/usr/bin/env nodeconst execa = require('execa')
const chalk = require('chalk')const run = async () => {let branch = ''let result = ''try {console.log(chalk.gray(`获取当前分支...`))const { stdout } = await execa.command('git symbolic-ref --short -q HEAD')branch = stdoutconsole.log(chalk.gray(`当前分支为: ${branch}`))} catch (error) {console.log(chalk.red(`获取分支失败:${error.message}`))process.exit(1) // 以失败码退出,用于 git hooks 拦截识别}try {console.log(chalk.gray(`检查当前分支是否推送过远程仓库...`))await execa.command(`git rev-parse --abbrev-ref ${branch}@{upstream}`)console.log(chalk.gray(`当前分支存在于 ${branch} 远程仓库...`))} catch (error) {console.log(chalk.yellow(`当前分支 ${branch} 未推送远程仓库 ${error.message}`),)try {console.log(chalk.green(`尝试推送分支 ${branch} 至远程仓库`))const { stderr } = await execa.command(`git push --set-upstream origin ${branch} --no-verify`,)result = stderr} catch (error) {console.log(chalk.red(`提交 gerrit 失败:${error.message}`))process.exit(1)}}try {console.log(chalk.gray(`对分支 ${branch} 提交 gerrit ...`))const { stderr } = await execa.command(`git push origin HEAD:refs/for/${branch} --no-verify`,)result = stderr} catch (error) {console.log(chalk.red(`提交 gerrit 失败:${error.message}`))process.exit(1)}console.log(chalk.green(`${branch} 提交 gerrit 成功,信息如下:n${result}`))process.exit(0) // 以成功码退出,用于 git hooks 通过识别
}run()

使用方式

全局使用(非前端工程推荐使用)

安装

npm i @dd/gerrit-cli -g

执行

确保在 git 工程目录下 gerrit

示例

f791273675dd8d29f7a5691b055f92b8.png

JavaScript 工程局部使用(前端工程推荐使用)

安装

npm i @dd/gerrit-cli --save-dev

在 package.json 中新增 gerrit scripts

"scripts": {..."cr": "gerrit"...},

执行

确保在 git 工程目录下

npm run cr

示例

7f11150c650a2ff42c7993a36ece3f32.png

和 husky 配合使用

在 package.json 中新增 gerrit scripts

"scripts": {..."cr": "gerrit"...
},
"husky": {"hooks": {"pre-push": "npm run cr"}
},

执行

确保在 git 工程目录下

git push

示例

3ff812f6e9ab1eab7fc2ecaabceb0623.png

TODO

  • 新增子命令支持生成 gerrit 的配置文件
  • 打印对应的 CR 规范的文档链接,否则新人会懵逼
  • 封装成 SDK 供其它工具调用

总结

我们多多少少会遇到类似的场景,以工程化的视角去封装它,让原本 npm 生态之外的 bash 脚本也能融于无形!

点击阅读我的更多文章​quanru.github.io

[滴滴出行-北京、杭州] 前端/算法/Android/Go/ Java /iOS/ PHP /C++等各类职位大量招聘,月 25k-60k,优秀另有期权

滴滴 2020 年大量职位内推,具体如下:

一、主要招聘职位 Java/前端 /Go/Php/C++/算法 /Android/iOS/大数据 /数分等等职位大量招聘。 业务包括网约车 /国际化 /车服 /两轮车 /外卖 /专车 /快车 /金融 /大数据 /地图等。

二、主要待遇 ① 有竞争力的薪资或期权 ② 六险一金,父母及子女的商业保险 ③ 全员 Mac,免费下午茶、免费晚餐 ④ 有孩子或者怀孕的女性员工有每周一天的在家办公机会

三、职位描述及要求 技术岗位主要在北京、杭州。所有职位详情可见: http://talent.didiglobal.com/social/list/1 可在这里选择合适职位

四、内推方式 欢迎将合适职位链接及简历直接发送到 quanruzhuoxiu@gmail.com 或微信(zhuoxiu_)联系我内推。 任何问题或疑惑欢迎留言,有关系好的小伙伴也可以给我们推荐。

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

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

相关文章

Insus Binary Utility

一个将数据流转换为binary(二进制)数据小工具,返回字符串。可以在三层架构中的二层程序处理数据流。 使用时需要引用名称空间using Insus.NET; 类别名称InsusBinaryUtility,需要实例化。 下载地址:http://download.cnblogs.com/insus/library…

圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...

有人好奇,既然圆周率是无限不循环小数,会不会包括这个世界上的任何信息,包含了这个世界?能否包含“任何信息”不好说,但一个冷知识是,圆周率里有每个人的银行卡密码!不信?看看这位来…

如何提高Debug效率

大家好,我是Z哥。可以不夸张地说,程序员可能有一半的时间都在修bug。虽说,根据28原则大部分bug都可以在搜索引擎上搜到(业务性bug除外),但是往往剩下的那20%bug会花费我们80%的时间。虽然解决这个问题最好的…

中断原理在计算机中的应用,最新 计算机原理与应用 复习3-判断题

最新 计算机原理与应用 复习题目1.INTR、INTA和NMI信号都是与中断有关的信号。( ) √2.8088在访问存储器时,必须用HOLD和HLDA两条信号线指示出总线是否可用。( )3.在8088时序中,在时钟周期T4状态期间,S2S1S0的任何变化指示一个总线周期的开始…

baidumap vue 判断范围_懂一点前端—Vue快速入门

01. 什么是 VueVue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架,是当下很火的一个 JavaScript MVVM 库,是以 数据驱动和组件化 的思想构建的。MVVM 模式简述下图不仅概括了 MVVM 模式 (Model-View-ViewModel)&#xff0c…

open*** 结合pam_mysql认证 failed to authenticate: Permission denied

open***的认证有很多方式,比如证书认证,用户名密码认证,而用户名密码认证也可用通过两种方式实现,一是使用pam_mysql实现open***利用mysql认证,二是使用radius实现open***利用mysql认证,网上这种配置都很多…

用文本挖掘剖析近5万首《全唐诗》,发现了这些有趣的秘密

楔子近些年来,弘扬中华传统文化的现象级综艺节目不断涌现,如《中国汉字听写大会》、《中国成语大会》、《中国谜语大会》、《中国诗词大会》等,其背后的社会成因,在于人们对中国文化中最精致文字的膜拜心理,虽然浸淫于…

如何在 C#9 中使用顶级程序 (top-level)

当我们用 C# 进行编码的时候,总需要写很多的模板代码,即使是最简单的 console 程序,想象一下,如果去测试一个 类库 或者 API 的功能,通常你会用 Console 程序去实现,在开始工作的时候会发现你受到了 C# 标准模板的限制…

跨部门不配合工作_跨部门协作,队友总是“甩锅”,这三个方法教你快速避坑!...

在日常的工作中,你觉得跨部门沟通的时间占用了多少时间?前阵子我经常会看到有人抱怨,说跨部门沟通的工作实在太难了,同事总是推脱扯皮,领导交代下来的事情,要么说不是自己的职责,要么说以前没做…

web页面在线编辑功能

首先在web.config文件中添加 <system.web> <httpHandlers> <add verb"GET" path"FtbWebResource.axd" type"FreeTextBoxControls.AssemblyResourceHandler,FreeTextBox"/> </httpHandlers></system.web> 注…

html哪个是最大标题,在下面的HTML中,哪个是最大的标题( )

参考答案如下下中单选(2分) 新民主主义革命的三大法宝是( )单选(2分) 关于计算机为什么基于二进制数来实现&#xff0c;标题下列说法不正确的是单选(3分) “某些人天生具有一些特质&#xff0c;下中这些特质会使他们成为伟大的领导者。”这是以下哪种理论的观点?标题单选(3分)…

C#通过工厂模式,我把一大堆if干掉了

概述之前做微信项目的时候&#xff0c;会涉及到一个回调&#xff0c;大家都知道回调事件是很多类型的&#xff0c;一般是根据不同的类型在进行不同的逻辑处理。这样就会延伸出一个问题&#xff0c;就是入口处会有一大堆if判断。这样本身是没什么问题的&#xff0c;只是看起来比…

再过四十年,你的女朋友可能是个美丽的机器人!不信你看

“美国西部、科幻、人工智能 、 机器人革命”&#xff0c;这 4 个看似不相关的元素却组成了一部新神剧《西部世界&#xff1a;Westworld》。《西部世界》可是聚粉丝千万&#xff0c;由1973年迈克尔克里奇顿执导的同名电影改编而成的电视剧。在剧中&#xff0c;整个“西部世界”…

mac下nvm_Mac OS 使用 nvm 管理 node 与 npm 版本

nvm 是 Mac 下的 node 管理工具&#xff0c;有点类似管理 Ruby 的 rvm&#xff0c;如果是需要管理 Windows 下的 node&#xff0c;官方推荐是使用 nvmw 或 nvm-windows 。以下具体说下 Mac 系统中的安装与使用细节(Windows 系统仅供类比参考)。1. 卸载已安装到全局的 node/npm如…

如何解决ORA-12638: 身份证明检索失败错误

今天连接一个以前正常连接的Oracle数据库&#xff0c;突然报错ORA-12638&#xff0c;说身份证明检索失败。感觉很奇怪&#xff0c;后来一查&#xff0c;发现是因为我电脑是出于Windows的Domain中的&#xff0c;而sqlnet文件中指定的认证方式是MTS&#xff0c;所以出错了。 解决…

模型存储在哪里_最强的模型工作收纳站「Artty Station」登场!

大部分做模型的人&#xff0c;都有同一个梦想——那就是「属于自己的模型空间」。但很少有人&#xff0c;有足够的空间去收纳自己的模型工具。而现在&#xff0c;一款号称史上最强的模型收纳站「Artty Station」横空出世了&#xff0c;现在正在日本网站Makuake上进行众筹&#…

.NET6 中的 PriorityQueue

.NET6 中的 PriorityQueueIntro.NET 6 中引入了一个新的集合类型 PriorityQueue&#xff0c;正如它的名字那样&#xff0c;在普通的 Queue 基础之上增加了优先级的支持&#xff0c;接下来就一起来看一下怎么使用&#xff0c;以及一些常用的使用场景介绍。Get Started来看一个简…

成渝地区微型计算机产业,2020届广州市高三年级调研测试文综地理试题(含答案).doc...

2020届广州市高三年级调研测试文综地理试题(含答案).doc2020届广州市高三年级调研测试文科综合(地理部分)一、选择题下表为我国四个省市2009年、2018年微型计算机产量对比表。据此完成1-3题。1与上海、江苏相比&#xff0c;2009年成渝地区微型计算机生产处于“空白”状态&#…

大数据教你实现预测未来,这不是梦

随着数据挖掘与人工智能技术的发展&#xff0c;越来越多的企业将大数据运用到生产实践与决策指导中。其中&#xff0c;构建合适的模型对未来的趋势进行预测&#xff0c;是数据挖掘中十分重要的一部分。本文将通过一个小案例教会你如何利用数据挖掘技术实现预测未来不是梦。【工…

简单而不简陋﹣wp7视觉点滴

一直就很期待&#xff0c;引入了Metro设计理念的wp7的真实操作体验&#xff0c;现在终于如愿了。拿到测试机&#xff0c;首先迅速的过了一遍&#xff0c;第一印象就是界面简单明了&#xff0c;没有华丽的高光、没有跌宕的质感&#xff0c;真的感觉就像在公共场所看到的信息指示…