我們先前費了很大的力氣,打造出一個這麼完整的 Boilerplate,但是究竟要怎麼拿它來加速開發客製化的程式呢?直覺上當然就是直接 Clone 下來開始客製化,但是一旦這麼做,Boilerplate 的 Codebase 和客製化 App 的 Codebase 從此就攪和在一起了,可想而知專案會變得難以維護。
所以筆者在此提出 mirror
Branch 的概念,這是在 Git Flow 的 Branching Model 下新增的獨立 Branch,基本上就是把 Boilerplate Repo 的 master branch
拉到 App Repo 當作 mirror branch
:
cd <your_project>
git flow init -d
git remote add -t master mirror https://github.com/gocreating/express-react-hmr-boilerplate.git
git fetch mirror master:mirror
再利用 Git Flow 的操作,將專案的初始化當作一個 Feature 合併到 develop branch:
git flow feature start mirror
git merge --no-ff --no-edit mirror
git flow feature finish mirror
接著你可能會需要修改 Boilerplate 的設定,像是 MongoDB 的帳密、.gitignore 設定等等,筆者自己是當作一個 Feature 來處理:
git flow feature start tune-mirror
# git commit ...
git flow feature finish tune-mirror
如果是剛建立的專案,可以用以下指令 Push 至 Git Server:
git remote add origin <your_project.git>
git push -u origin master
各位可能會覺得上面的做法很瑣碎,有種多此一舉的感覺,但其實目的是為了 Boilerplate 可能隨時會更新而設計。我們的 Boilerplate 不是萬能的,總有一天會發現 Bug,總有一些時候,會想要做一些架構性的改善,或是新增好用的功能,簡單來說就是我們隨時會升級 Boilerplate。
倘若 Boilerplate 更新了,我們要如何把新的 Code 合併到已經使用 Boilerplate 開發到一半的 App 呢?這時候 mirror branch 就發揮了很大的好處,因為 mirror branch 和 Boilerplate Repo 是完全同步的,所以可以直接 Pull 最新版本的 Boilerplate:
git checkout mirror
git pull mirror mirror
接著才是考驗開發者功力的時候,一樣使用 Git Flow 開出 Feature 來處理新版本 mirror 和目前 App 的 Conflict:
git checkout develop
git flow feature start upgrade-mirror
git merge --no-ff --no-edit mirror
# solve conflicts
git flow feature finish upgrade-mirror
如果不是做架構性的變動,只是單純安全性更新、加新 Feature 的話,這樣的維護模式其實不太需要處理 Conflict,無論手上有多少客製化的 App 專案,都可以借助這個 mirror branch 機制優雅地管理每一個 App Repo!