[譯] 我如何使用 Node.js 來實現工做自動化

您知道在工做中有不少必須完成的繁瑣任務:更新配置文件,複製和粘貼文件,更新 Jira 任務。前端

一段時間以後,這些工做的消耗時間會逐漸累積。2016 年,我在一家網絡遊戲公司工做時,狀況就是如此。爲遊戲構建可配置的模板對於遊戲開發來講是一項很是有意義的工做,但我大約 70% 的時間都花在了複製這些遊戲模板和部署這些從新封裝的實現上。node

什麼是 Reskin?

公司 reskin 的定義是指使用相同的遊戲機制,屏幕和元素的定位,但改變諸如色彩和素材資源之類的純視覺美學的相關內容。所以,在像「Rock Paper Scissors」這樣簡單的遊戲中,咱們建立一個具備以下基本素材資源的模板。android

當咱們建立一個這樣的 reskin 以後,咱們就能夠更換不一樣的素材資源。若是你看看像 Candy Crush 或 Angry Birds 這樣的遊戲,你會發現它們一個遊戲有不少不一樣的版本。一般有對應萬聖節,聖誕節或復活節的版原本區分發布。從商業角度來看,這樣作很是有意義。如今...回到咱們的實現。每一個遊戲都共用相同的 JavaScript 文件,但會加載包含不一樣內容和資源路徑的 JSON 文件。結果是?ios

我和其餘開發人員天天都有一堆的工做日程表,個人第一個想法是「其實不少工做均可以實現自動化」。每當我去建立一個新遊戲時,我都必須執行如下步驟:git

  1. git pull 模板倉庫以確保它們是最新的;
  2. 從主分支建立一個新的分支 — 由 Jira 任務 ID 標識;
  3. 製做我須要構建的模板的副本;
  4. 運行 gulp;
  5. 更新 config.json 文件中的內容。這裏面涉及到資源路徑,標題,段落以及數據服務請求等;
  6. 本地編譯並檢查與任務需求文檔要求的內容是否匹配;
  7. 與設計師確認他們對結果是否滿意;
  8. 合併到主分支並繼續下一個分支;
  9. 更新 Jira 任務的狀態,並發表評論;
  10. 整理並再重複以上過程。

對我來講,這感受更像是一種管理工做而不是實際的開發工做。我曾在之前的角色中接觸過 Bash 腳本,並在此基礎上建立過一些腳本,以減小所作的工做。其中一個腳本能夠更新模板並建立一個新的分支,另外一個腳本執行了一個 commit 並將項目合併到開發和生產環境中。github

手動建立一個項目須要三到十分鐘。部署可能須要五到十分鐘。這些會根據遊戲的複雜程度而不一樣,有時甚至可能須要十分鐘到半天。腳本會有所幫助,但仍然須要大量時間用於更新內容或追查丟失的信息。npm

只經過編寫代碼來縮短期是不夠的。須要考慮更好的方法來處理咱們的工做流,以便我能夠更好地利用這些腳本。將內容從文檔中移出,將其分解爲相關的自定義字段,並移入 Jira 任務。設計人員不須要再發送資源在公共服務器的連接地址,而更實際的作法是設置一個內容交付網絡(CDN)存儲庫,其中包含資源的開發和生產的 URL。json

Jira API

這樣的事情可能須要運行一段時間才能獲得看到效果,但咱們的流程確實會隨着時間的推移而有所改善。我對咱們的項目管理工具 Jira 的 API 進行了一些研究,並對我正在處理的 Jira 任務作了一些請求。我收集了不少有價值的數據。這些數據很是有價值,因此我決定將她們集成到個人 Bash 腳本中,以便從 Jira 任務中讀取這些數據,並在完成任務後給相關負責人留言。gulp

從 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 實現自動化》。

這本書分爲兩部分:

第 1 部分

第一部分是一個方法合集,或者做爲單個全局命令的指令構建模塊。它們能夠在你天天的工做中使用,也能夠純粹爲了方便在任什麼時候候調用它們來加快你的工做流程。

第 2 部分

第二部分是一個從頭開始建立跨平臺編譯工具的演練。每一個腳本實現特定的某個任務,由主命令,一般就是項目的名稱,將它們所有封裝起來。

書中的項目被稱爲 nobot (no-bot),它基於一個小卡通機器人。我但願你能喜歡並從中能夠學到一些東西。

我知道每一個企業的狀況和流程都不一樣,可是你應該從中發現一些東西,即便它很不起眼,也會讓你天天在辦公室裏的工做變得更加輕鬆。

花更多時間開發,減小管理時間。

謝謝閱讀!若是你喜歡,請在下面給咱們點贊。👏

有關軟件/硬件各方面的視頻,請查看個人 YouTube 頻道:www.youtube.com/channel/UCK…

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索