11使用 Go 管理 Makefile

簡介

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

這個時候, 就需要使用腳本來取代這些復(fù)雜的命令,
減少輸錯命令的可能, 也可以為后來者指明常用的操作.

Makefile

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

簡單介紹下 Makefile 的規(guī)則.

target: dependencies
    system command(s)

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

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

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

使用 make 命令可以運行各種 target. 如果不帶 target 參數(shù),
第一個 target 會被作為默認目標(biāo).

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

.PHONY: all test clean doc ci

更多內(nèi)容可以參考
跟我一起寫 Makefile

實踐

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

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

在項目的根目錄添加 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/emailAddress=coolcat@qq.com"
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 服務(wù)器"
    @echo "make dbcli - 連接到 mysql 命令行"

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

這里的所有 target 都是偽目標(biāo).用來包裝一些簡單的 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 服務(wù)器
  • make dbcli - 連接到 mysql 命令行
  • make help - 查看幫助信息

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

總結(jié)

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

當(dāng)前部分的代碼

作為版本 v0.11.0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 來自陳浩的一片老文,但絕對營養(yǎng)。 示例工程:3 個頭文件*.h,和 8 個 C 文件*.c。 初 編譯過程,源文件...
    周筱魯閱讀 4,778評論 0 17
  • makefile關(guān)系到整個工程的編譯規(guī)則,一個工程中的源文件不計其數(shù),按其類型、功能、模塊分別放在若干的目錄當(dāng)中,...
    Joe_HUST閱讀 1,977評論 0 3
  • Makefile規(guī)則 一句話總結(jié)就是依賴關(guān)系,簡單如下所示 target … : prerequisites … ...
    明明就_c565閱讀 4,867評論 0 2
  • 金錢至上嗎?得不到的總是最好的,擁有之后又回頭思考人生,大概這是每個人必須經(jīng)歷的成長過程吧 人們通...
    良人_e64c閱讀 327評論 1 3
  • 整形超聲刀是什么意思?做過的來上上課。 我猜應(yīng)該很多朋友們說起超聲刀的效果,都是頭頭是道, 但是對超聲刀本身其實一...
    183649gw閱讀 423評論 0 0

友情鏈接更多精彩內(nèi)容