- 原文地址:How I automated my job with Node.js
- 原文作者:Shaun Michael Stone
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:geniusq1981
- 校對者:Starriers
您知道在工作中有很多必須完成的繁瑣任務:更新配置檔案,複製和貼上檔案,更新 Jira 任務。
一段時間之後,這些工作的消耗時間會逐漸累積。2016 年,我在一家網路遊戲公司工作時,情況就是如此。為遊戲構建可配置的模板對於遊戲開發來說是一項非常有意義的工作,但我大約 70% 的時間都花在了複製這些遊戲模板和部署這些重新封裝的實現上。
什麼是 Reskin?
公司 reskin 的定義是指使用相同的遊戲機制,螢幕和元素的定位,但改變諸如色彩和素材資源之類的純視覺美學的相關內容。因此,在像“Rock Paper Scissors”這樣簡單的遊戲中,我們建立一個具有如下基本素材資源的模板。
當我們建立一個這樣的 reskin 之後,我們就可以更換不同的素材資源。如果你看看像 Candy Crush 或 Angry Birds 這樣的遊戲,你會發現它們一個遊戲有很多不同的版本。通常有對應萬聖節,聖誕節或復活節的版本來區分發布。從商業角度來看,這樣做非常有意義。現在...回到我們的實現。每個遊戲都共用相同的 JavaScript 檔案,但會載入包含不同內容和資源路徑的 JSON 檔案。結果是?
我和其他開發人員每天都有一堆的工作日程表,我的第一個想法是“其實很多工作都可以實現自動化”。每當我去建立一個新遊戲時,我都必須執行以下步驟:
- git pull 模板倉庫以確保它們是最新的;
- 從主分支建立一個新的分支 — 由 Jira 任務 ID 標識;
- 製作我需要構建的模板的副本;
- 執行 gulp;
- 更新 config.json 檔案中的內容。這裡面涉及到資源路徑,標題,段落以及資料服務請求等;
- 本地編譯並檢查與任務需求文件要求的內容是否匹配;
- 與設計師確認他們對結果是否滿意;
- 合併到主分支並繼續下一個分支;
- 更新 Jira 任務的狀態,並發表評論;
- 整理並再重複以上過程。
對我來說,這感覺更像是一種管理工作而不是實際的開發工作。我曾在以前的角色中接觸過 Bash 指令碼,並在此基礎上建立過一些指令碼,以減少所做的工作。其中一個指令碼可以更新模板並建立一個新的分支,另一個指令碼執行了一個 commit 並將專案合併到開發和生產環境中。
手動建立一個專案需要三到十分鐘。部署可能需要五到十分鐘。這些會根據遊戲的複雜程度而不同,有時甚至可能需要十分鐘到半天。指令碼會有所幫助,但仍然需要大量時間用於更新內容或追查丟失的資訊。
只通過編寫程式碼來縮短時間是不夠的。需要考慮更好的方法來處理我們的工作流,以便我可以更好地利用這些指令碼。將內容從文件中移出,將其分解為相關的自定義欄位,並移入 Jira 任務。設計人員不需要再傳送資源在公共伺服器的連結地址,而更實際的做法是設定一個內容交付網路(CDN)儲存庫,其中包含資源的開發和生產的 URL。
Jira API
這樣的事情可能需要執行一段時間才能得到看到效果,但我們的流程確實會隨著時間的推移而有所改善。我對我們的專案管理工具 Jira 的 API 進行了一些研究,並對我正在處理的 Jira 任務做了一些請求。我收集了很多有價值的資料。這些資料非常有價值,所以我決定將她們整合到我的 Bash 指令碼中,以便從 Jira 任務中讀取這些資料,並在完成任務後給相關負責人留言。
從 Bash 轉到 Node
Bash 指令碼很好,但如果有人在 Windows 上工作,就無法使用了。在做了一些研究之後,我決定使用 JavaScript 將整個過程包裝成一個定製化的構建工具。我稱之為 Mason,它會改變一切。
CLI
當您在終端中使用 Git 時,您會注意到它有一個非常友好的命令列介面。如果你拼寫錯誤或者輸入錯誤的命令,它會禮貌地給出你要輸入內容的相關建議。一個名為 commander 的庫也使用了相同的行為,它是我使用過的眾多庫中的一個。
考慮下面的簡化程式碼示例。它正在引導命令列介面(CLI)應用程式。
src/mason.js
#! /usr/bin/env node
const mason = require('commander');
const { version } = require('./package.json');
const console = require('console');
// commands
const create = require('./commands/create');
const setup = require('./commands/setup');
mason
.version(version);
mason
.command('setup [env]')
.description('run setup commands for all envs')
.action(setup);
mason
.command('create <ticketId>')
.description('creates a new game')
.action(create);
mason
.command('*')
.action(() => {
mason.help();
});
mason.parse(process.argv);
if (!mason.args.length) {
mason.help();
}
複製程式碼
使用 npm,您可以執行 package.json 中的一個連結,它建立了一個全域性的別名。
...
"bin": {
"mason": "src/mason.js"
},
...
複製程式碼
當我在專案的根目錄中執行 npm link。
npm link
複製程式碼
它將為我提供一個我可以呼叫的 mason 命令。所以每當我在終端呼叫 mason,它就會執行 mason.js 指令碼。所有的任務都在這個 mason 命令中實現了,我每天都用它來構建遊戲。我節省的時間真是難以置信。
您可以在下面看到——在我當時所設想的示例中——我將一個 Jira 任務號作為引數傳遞給命令。這將訪問 Jira API,並獲取更新遊戲我所需要的全部資訊。然後,它將繼續編譯和部署專案。之後我會發一條評論,@負責人和設計師,讓他們知道已經完成了。
$ mason create GS-234
... calling Jira API
... OK! got values!
... creating a new branch from master called 'GS-234'
... updating templates repository
... copying from template 'pick-from-three'
... injecting values into config JSON
... building project
... deploying game
... Perfect! Here is the live link
http://www.fake-studio.com/game/fire-water-earth
... Posted comment 'Hey [~ben.smith], this has been released. Does the design look okay? [~jamie.lane]' on Jira.
複製程式碼
所有這一切只用幾個鍵就搞定了!
我對整個專案非常滿意,於是我決定在我剛剛出版的一本書中重寫一個更好的版本,書名為《用 Node.js 實現自動化》。
- 彩色列印: amzn.eu/aA0cSnu
- Kindle: amzn.eu/dVSykv1
- Kobo: www.kobo.com/gb/en/ebook…
- Leanpub: leanpub.com/automatingw…
- Google Play: play.google.com/store/books…
這本書分為兩部分:
第 1 部分
第一部分是一個方法合集,或者作為單個全域性命令的指令構建模組。它們可以在你每天的工作中使用,也可以純粹為了方便在任何時候呼叫它們來加快你的工作流程。
第 2 部分
第二部分是一個從頭開始建立跨平臺編譯工具的演練。每個指令碼實現特定的某個任務,由主命令,通常就是專案的名稱,將它們全部封裝起來。
書中的專案被稱為 nobot (no-bot),它基於一個小卡通機器人。我希望你能喜歡並從中可以學到一些東西。
我知道每個企業的情況和流程都不同,但是你應該從中發現一些東西,即使它很不起眼,也會讓你每天在辦公室裡的工作變得更加輕鬆。
花更多時間開發,減少管理時間。
謝謝閱讀!如果你喜歡,請在下面給我們點贊。?
有關軟體/硬體各方面的視訊,請檢視我的 YouTube 頻道:www.youtube.com/channel/UCK…
如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。