Go 項目使用 Makefile
01介紹
Go 提供一個名為go的命令,該命令可自動下載、構建、安裝和測試 Go 包和命令。
Go 提供go命令,官方的目的是為了不需要編寫 Makefile,而是能夠僅使用 Go 源代碼本身中的信息來構建 Go 代碼。
但是,我們在 Go 項目中也不需要完全摒棄使用 make 和 Makefile,可以使用 Makefile 的“偽目標”,簡化使用 go 命令的復雜性,規范團隊使用 go 命令的方式,提升個人或團隊的生產力。
02make 和 Makefile
make 命令行工具可以自動判斷是否需要重新編譯程序,實際上 make 不僅限于程序,我們可以使用它來描述任何任務,只要其他文件發生更改,某些文件就必須從其他文件自動更新。
在使用 make 命令行工具之前,我們需要編寫一個名為 Makefile 的文件,該文件描述程序中文件之前的關系,并提供用于更新每個文件的命令。也就是說 Makefile 決定 make 做什么。
關于 Makefile 的介紹,感興趣的讀者朋友,可以查閱相關資料深入學習,本文僅介紹 Makefile 的規則(格式),如下所示:
target : prerequisites
<Tab>command
或
target : prerequisites ;command
閱讀上面示例代碼,target 是目標文件,多個目標文件之間使用空格分隔,一般只有一個目標文件,也可以是“偽目標”(某個操作的名字);prerequisites 是先決條件;command 是“命令”,可以在 prerequisites 后面,使用分號分隔,也可以另起一行,但是必須以開頭,如果想要使用其他鍵,可以使用內置變量 .RECIPEPREFIX 聲明。
target 目標是必須的,不可省略。prerequisites 和 command 是可選的,但是二者必須存在其一。
03Go 項目使用 Makefile
在 Go 項目中使用 Makefile,一般我們只會使用“偽目標”,我們使用 go build 構建可執行文件為例,介紹 Go 項目怎么使用 Makefile。
示例代碼:
build: go build -o blog
閱讀上面示例代碼,我們編寫一個簡單的 Makefile,定義一個“偽目標” build,命令是 go build -o blog,構建名為 blog 的可執行文件。
使用 make 命令行工具,運行“偽目標”build。
make build
運行 make build,終端打印出 Makefile 中“偽目標” build 的命令。
go build -o blog
如果我們不想打印出執行的命令,可以在命令前面加上 @ 符號。
在實際項目開發時,我們可能需要構建多個操作系統的可執行文件,我們再編寫一個 Makefile,新增三個“偽目標”,分別是windows、linux 和 darwin。
示例代碼:
APP=blog
build:
@go build -o ${APP}
windows:
@GOOS=windows go build -o ${APP}-windows
linux:
@GOOS=linux go build -o ${APP}-linux
darwin:
@GOOS=darwin go build -o ${APP}-darwin
閱讀上面示例代碼,我們定義一個自定義變量 APP,在命令行中使用 $(APP) 調用變量,并且 GOOS 指定操作系統,使用@開頭,不再打印執行命令。
運行 make windows、make linux 和 make darwin,分別構建 windows、linux 和 drawin 操作系統的可執行文件。
運行結果如下:
.
├── Makefile
├── blog
├── blog-darwin
├── blog-linux
├── blog-windows
├── go.mod
└── main.go
需要注意的是,如果有文件名和“偽目標”同名,那么該“偽目標”無法使用 make 命令執行指定的 command。因為 make 發現與“偽目標”同名的文件已存在,將不會再重新構建,所以就不會運行指定的 command,為了避免出現該問題,可以使用內置目標名.PHONY聲明這些“偽目標”名是“偽目標”,而不是與“偽目標”同名的文件。
完整 Makefile 文件:
APP=blog
.PHONY: help all build windows linux darwin
help:
@echo "usage: make <option>"
@echo "options and effects:"
@echo " help : Show help"
@echo " all : Build multiple binary of this project"
@echo " build : Build the binary of this project for current platform"
@echo " windows: Build the windows binary of this project"
@echo " linux : Build the linux binary of this project"
@echo " darwin : Build the darwin binary of this project"
all:build windows linux darwin
build:
@go build -o ${APP}
windows:
@GOOS=windows go build -o ${APP}-windows
linux:
@GOOS=linux go build -o ${APP}-linux
darwin:
@GOOS=darwin go build -o ${APP}-darwin
閱讀上面示例代碼,我們可以看到 Makefile 中第二個“偽目標” all,該目標只有 4 個先決條件,沒有任何命令。執行 make all 命令,可以批量執行多個“偽目標”。該命令等同于以下命令:
make build
make windows
make linux
make darwin
細心的讀者朋友們閱讀到此處,心中可能會有一個疑問,想要知道 Makefile 中包含哪些“目標”,必須查看 Makefile 文件嗎?
不必如此,我們可以在 Makefile 中編寫一個“偽目標” help,用于描述 Makefile 中的“偽目標”列表和使用示例等。
Make 命令運行時,如果不指定“目標”,默認執行 Makefile 文件的第一個“目標”。一般將 help 作為 Makefile 的第一個“偽目標”,我們可以執行 make 或 make help 命令,輸出使用方法。
04總結
本文我們介紹 make 和 Makefile 的使用方法,并且通過 go 命令中的 go build 介紹 Go 項目怎么使用 Makefile,大家可以舉一反三,編寫自己的 Go 項目 Makefile。