Golang Gin實踐 番外 請入門 Makefile
含一定複雜度的軟體工程,基本上都是先編譯 A,再依賴 B,再編譯 C...,最後才執行建構
如果每次都人為編排,又或是每新來一個同僚就問你項目 D 怎麼建構、重新建構需要注意什麼...等等情況,豈不是要崩潰?
我們常常會在開源項目中發現 Makefile,你是否有過疑問?
本章節會簡單介紹 Makefile 的使用方式,最後建議深入學習
對于建構編排,Docker 有 Dockerfile ,在 Unix 中有神器 Make
Make 是一個建構自動化工具,會在目前目錄下尋找 Makefile 或 makefile 檔案。如果存在,會依據 Makefile 的建構規則去完成建構
當然了,實際上 Makefile 内都是你根據 make 文法規則,自己編寫的特定 Shell 指令等
它是一個工具,規則也很簡單。在支援的範圍内,編譯 A, 依賴 B,再編譯 C,完全沒問題
Makefile 由多條規則組成,每條規則都以一個 target(目标)開頭,後跟一個 : 冒号,冒号後是這一個目标的 prerequisites(前置條件)
緊接着新的一行,必須以一個 tab 作為開頭,後面跟随 command(指令),也就是你希望這一個 target 所執行的建構指令
target:一個目标代表一條規則,可以是一個或多個檔案名。也可以是某個操作的名字(标簽),稱為僞目标(phony)
prerequisites:前置條件,這一項是可選參數。通常是多個檔案名、僞目标。它的作用是 target 是否需要重新建構的标準,如果前置條件不存在或有過更新(檔案的最後一次修改時間)則認為 target 需要重新建構
command:建構這一個 target 的具體指令集
在編寫 Makefile 前,需要先分析建構先後順序、依賴項,需要解決的問題等
1、在上述檔案中,使用了 <code>.PHONY</code>,其作用是聲明 build / clean / tool / lint / help 為僞目标,聲明為僞目标會怎麼樣呢?
聲明為僞目标後:在執行對應的指令時,make 就不會去檢查是否存在 build / clean / tool / lint / help 其對應的檔案,而是每次都會運作标簽對應的指令
若不聲明:恰好存在對應的檔案,則 make 将會認為 xx 檔案已存在,沒有重新建構的必要了
2、這塊比較簡單,在指令行執行即可看見效果,實作了以下功能:
make: make 就是 make all
make build: 編譯目前項目的包和依賴項
make tool: 運作指定的 Go 工具集
make lint: golint 一下
make clean: 删除對象檔案和緩存檔案
make help: help
如果你實際操作過,可能會有疑問。明明隻是執行指令,為什麼會列印到标準輸出上了?
make 預設會列印每條指令,再執行。這個行為被定義為回聲
可以在對應指令前加上 @,可指定該指令不被列印到标準輸出上
那麼還有其他的特殊符号嗎?有的,請課後去了解下 +、- 的用途 ????
這是一篇比較簡潔的文章,希望可以讓您對 Makefile 有一個基本了解
恭喜你必備技能 +1