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示例
JavaScript 工程局部使用(前端工程推薦使用)
安裝
npm i @dd/gerrit-cli --save-dev
在 package.json 中新增 gerrit scripts
"scripts": {..."cr": "gerrit"...},執行
確保在 git 工程目錄下npm run cr
示例
和 husky 配合使用
在 package.json 中新增 gerrit scripts
"scripts": {..."cr": "gerrit"... }, "husky": {"hooks": {"pre-push": "npm run cr"} },執行
確保在 git 工程目錄下git push
示例
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_)聯系我內推。 任何問題或疑惑歡迎留言,有關系好的小伙伴也可以給我們推薦。
總結
以上是生活随笔為你收集整理的uibot在子程序执行js失败_使用 Node.js 将珍藏的 bash 脚本封装成命令行工具的全部內容,希望文章能夠幫你解決所遇到的問題。