使用 Go 管理 Makefile

簡介

很多時候, 我們需要運行多個命令來能完成一件事,
又或者某個命令需要指定很多參數.

這個時候, 就需要使用腳本來取代這些複雜的命令,
減少輸錯命令的可能, 也可以爲後來者指明常用的操作.

Makefile

Makefile 就是爲此而生的, 相對於用途廣泛的 shell 腳本,
Makefile 專注於構建自動化過程, 通常用於編譯源碼等.
很多項目都會提供 Makefile 文件, 只需要簡單地運行
make 就能輕鬆完成編譯構建的過程.

簡單介紹下 Makefile 的規則.

target: dependencies
    system command(s)

target 通常是程序要生成的目標文件的名字. 但也可以是一個動作的名字.

dependencies 是依賴, 通常是文件, 完成 target 所需要的輸入.

system command(s) 是完成 target 所需要運行的指令, 即 shell 命令.
一條語句一行, 使用單個 tab 縮進.

使用 make 命令可以運行各種 target. 如果不帶 target 參數,
第一個 target 會被作爲默認目標.

很多時候, Makefile 不是爲了編譯, 也不再引用任何文件,
僅僅是爲了整合多個命令, 比寫腳本方便多.
這個時候涉及到一個叫做僞目標的指令 .PHONY.
.PHONY 後面跟着的多個 target 都不是要生成的文件的名字,
而是指代一個動作, 一個行爲. 比如 test 指運行測試, clean 清理文件等.

.PHONY: all test clean doc ci

更多內容可以參考
跟我一起寫 Makefile

實踐

注意, windows 下沒有 make 命令, 所以 Makefile 也就無法使用.

你可以在 docker 容器中運行命令, 可以參考另一篇文章
在 VS Code 中使用容器開發.

在項目的根目錄添加 Makefile 文件:

all: gotool build
build:
    @go build ./
run:
    @go run ./
clean:
    rm -f web
    find . -name "[._]*.s[a-w][a-z]" | xargs -i rm -f {}
gotool:
    go fmt ./
    go vet ./
ca:
    MSYS_NO_PATHCONV=1 openssl req -new -nodes -x509 -out conf/server.crt -keyout conf/server.key -days 3650 -subj "/C=CN/ST=SH/L=SH/O=CoolCat/OU=CoolCat Software/CN=127.0.0.1/[email protected]"
mysql:
    docker-compose up -d mysql
dbcli:
    docker-compose run --rm dbclient

help:
    @echo "make - 格式化 Go 代碼, 並編譯生成二進制文件"
    @echo "make build - 編譯 Go 代碼, 生成二進制文件"
    @echo "make run - 直接運行 Go 代碼"
    @echo "make clean - 移除二進制文件和 vim swap files"
    @echo "make gotool - 運行 Go 工具 'fmt' and 'vet'"
    @echo "make ca - 生成證書文件"
    @echo "make mysql - 啓動 mysql 服務器"
    @echo "make dbcli - 連接到 mysql 命令行"

.PHONY: all build run clean gotool ca mysql dbcli help

這裏的所有 target 都是僞目標.用來包裝一些簡單的 shell 命令.

可以在項目根目錄下運行以下命令:

  • make - 格式化 Go 代碼, 並編譯生成二進制文件
  • make build - 編譯 Go 代碼, 生成二進制文件
  • make run - 直接運行 Go 代碼
  • make clean - 移除二進制文件和 vim swap files
  • make gotool - 運行 Go 工具 'fmt' and 'vet'
  • make ca - 生成證書文件
  • make mysql - 啓動 mysql 服務器
  • make dbcli - 連接到 mysql 命令行
  • make help - 查看幫助信息

有了 Makefile 的幫助, 很多事情變得簡單起來了,
比如要生成證書文件, 只需要運行 make ca 就行了,
不用輸入一大行命令了.

總結

Makefile 是 linux 下常用的工具, 對於提升效率是非常有效的.

當前部分的代碼

作爲版本 v0.11.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章