uibot在子程序执行js失败_使用 Node.js 将珍藏的 bash 脚本封装成命令行工具
闡述如何將一個(gè)常用的 bash 腳本融入 npm 生態(tài)之中,此處以最近遇到的一個(gè) CR 提交腳本為例。
背景
作為程序猿,大家或多或少地都用過 GitHub 上的 merge request 功能。當(dāng)然,除了這類 Code Review 方式,不少公司都有自己的 Code Review 平臺(tái),我司也不例外,我們使用了類似 Gerrit 的工具,此處我們暫且以 Gerrit 指代。由于最近在治理工程時(shí),需要全面切(要)到(求)使用 Gerrit 進(jìn)行 CR 提交。發(fā)現(xiàn) Gerrit 提交命令不是那么好記,經(jīng)常需要先 git push,接著被攔截報(bào)錯(cuò)之后,再根據(jù)提示復(fù)制命令行,再次執(zhí)行方可成功提交 Gerrit 。作為攻城獅,這有點(diǎn)難以忍受了!!!
訴求
一、有沒有單獨(dú)的命令讓我直接提交 Gerrit?
二、有沒有命令行工具,我直接安裝就能使用?
三、在 git push 后,經(jīng)由 git hook 攔截后按需提交 Gerrit?
解決
一、有沒有單獨(dú)的命令讓我直接提交 Gerrit?
答:有的,有次同事見我提交 Gerrit 不順暢,轉(zhuǎn)發(fā)了一個(gè) bash 腳本給我:『你把它復(fù)制到 /usr/local/bin 目錄下,就能直接使用 gerrit 執(zhí)行了』。珍藏腳本如下(gerrit):
bash branch=$(git symbolic-ref --short -q HEAD)git push origin HEAD:refs/for/${branch}
二、有沒有命令行工具,我直接安裝就能使用?
答:有的,既然都有腳本了,作為前端開發(fā),必須用心愛的 Node.js 封裝一個(gè)命令行工具,只需兩步即可使用:首先執(zhí)行 npm i @dd/gerrit-cli -g ;接著在工程目錄下執(zhí)行 gerrit 即可使用。
三、在 git push 后,經(jīng)由 git hook 攔截后按需提交 Gerrit?
答:有的,如果你還覺得全局安裝命令行太麻煩,或者害怕新人來(lái)了一臉懵逼。那么,還可以借助 git hook 進(jìn)行攔截,用戶只需要『無(wú)腦地』執(zhí)行 git push 即可。當(dāng)然前端這塊有現(xiàn)成的 git hook 神器,它就是人見人愛的哈士奇,至于其它語(yǔ)言生態(tài),大家找找應(yīng)該有的。
我們來(lái)看看如何封裝上述腳本吧!
實(shí)現(xiàn)方式
1. 配置命令
如何能讓別人安裝你的 npm 包時(shí),就能在終端中執(zhí)行命令行呢?只需對(duì)你的 npm 包的 package.json 添加 bin 字段:
{"name": "your-first-cli-package","version": "1.0.0","description": "你的第一個(gè)命令行工具","main": "index.js","bin": {"yourCommand": "index.js"}, }之后別人使用 npm i -g your-first-cli-package 時(shí),即可在終端中執(zhí)行 yourCommand 調(diào)用你的 index.js 的邏輯啦。如果使用局部安裝的方式,即 npm i your-first-cli-package,命令行將被安裝到 node_modules/.bin/yourCommand 下,其內(nèi)容正是 index.js 的內(nèi)容。此時(shí)可編輯 npm scripts 調(diào)用。
2. 調(diào)用聲明
由于我們使用 Node.js 實(shí)現(xiàn),因此命令行對(duì)應(yīng)的入口 js 文件(此處即 index.js)需要聲明當(dāng)前文件使用 node 執(zhí)行:
#!/usr/bin/env node // 此處編寫 yourCommand 命令的邏輯3. 編寫邏輯
此處實(shí)現(xiàn)得比較粗糙,目前就一個(gè)命令,因此未引入 args 這類包。
#!/usr/bin/env nodeconst execa = require('execa') const chalk = require('chalk')const run = async () => {let branch = ''let result = ''try {console.log(chalk.gray(`獲取當(dāng)前分支...`))const { stdout } = await execa.command('git symbolic-ref --short -q HEAD')branch = stdoutconsole.log(chalk.gray(`當(dāng)前分支為: ${branch}`))} catch (error) {console.log(chalk.red(`獲取分支失敗:${error.message}`))process.exit(1) // 以失敗碼退出,用于 git hooks 攔截識(shí)別}try {console.log(chalk.gray(`檢查當(dāng)前分支是否推送過遠(yuǎn)程倉(cāng)庫(kù)...`))await execa.command(`git rev-parse --abbrev-ref ${branch}@{upstream}`)console.log(chalk.gray(`當(dāng)前分支存在于 ${branch} 遠(yuǎn)程倉(cāng)庫(kù)...`))} catch (error) {console.log(chalk.yellow(`當(dāng)前分支 ${branch} 未推送遠(yuǎn)程倉(cāng)庫(kù) ${error.message}`),)try {console.log(chalk.green(`嘗試推送分支 ${branch} 至遠(yuǎn)程倉(cāng)庫(kù)`))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(`對(duì)分支 ${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 通過識(shí)別 }run()使用方式
全局使用(非前端工程推薦使用)
安裝
npm i @dd/gerrit-cli -g
執(zhí)行
確保在 git 工程目錄下 gerrit示例
JavaScript 工程局部使用(前端工程推薦使用)
安裝
npm i @dd/gerrit-cli --save-dev
在 package.json 中新增 gerrit scripts
"scripts": {..."cr": "gerrit"...},執(zhí)行
確保在 git 工程目錄下npm run cr
示例
和 husky 配合使用
在 package.json 中新增 gerrit scripts
"scripts": {..."cr": "gerrit"... }, "husky": {"hooks": {"pre-push": "npm run cr"} },執(zhí)行
確保在 git 工程目錄下git push
示例
TODO
- 新增子命令支持生成 gerrit 的配置文件
- 打印對(duì)應(yīng)的 CR 規(guī)范的文檔鏈接,否則新人會(huì)懵逼
- 封裝成 SDK 供其它工具調(diào)用
總結(jié)
我們多多少少會(huì)遇到類似的場(chǎng)景,以工程化的視角去封裝它,讓原本 npm 生態(tài)之外的 bash 腳本也能融于無(wú)形!
點(diǎn)擊閱讀我的更多文章?quanru.github.io[滴滴出行-北京、杭州] 前端/算法/Android/Go/ Java /iOS/ PHP /C++等各類職位大量招聘,月 25k-60k,優(yōu)秀另有期權(quán)
滴滴 2020 年大量職位內(nèi)推,具體如下:
一、主要招聘職位 Java/前端 /Go/Php/C++/算法 /Android/iOS/大數(shù)據(jù) /數(shù)分等等職位大量招聘。 業(yè)務(wù)包括網(wǎng)約車 /國(guó)際化 /車服 /兩輪車 /外賣 /專車 /快車 /金融 /大數(shù)據(jù) /地圖等。
二、主要待遇 ① 有競(jìng)爭(zhēng)力的薪資或期權(quán) ② 六險(xiǎn)一金,父母及子女的商業(yè)保險(xiǎn) ③ 全員 Mac,免費(fèi)下午茶、免費(fèi)晚餐 ④ 有孩子或者懷孕的女性員工有每周一天的在家辦公機(jī)會(huì)
三、職位描述及要求 技術(shù)崗位主要在北京、杭州。所有職位詳情可見: http://talent.didiglobal.com/social/list/1 可在這里選擇合適職位
四、內(nèi)推方式 歡迎將合適職位鏈接及簡(jiǎn)歷直接發(fā)送到 quanruzhuoxiu@gmail.com 或微信(zhuoxiu_)聯(lián)系我內(nèi)推。 任何問題或疑惑歡迎留言,有關(guān)系好的小伙伴也可以給我們推薦。
總結(jié)
以上是生活随笔為你收集整理的uibot在子程序执行js失败_使用 Node.js 将珍藏的 bash 脚本封装成命令行工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打点滴的危害
- 下一篇: 跨部门不配合工作_跨部门协作,队友总是“