Golang Gin實踐 番外 請入門 Makefile

原文地址:Golang Gin實踐 番外 請入門 Makefilehtml

前言

含必定複雜度的軟件工程,基本上都是先編譯 A,再依賴 B,再編譯 C...,最後才執行構建git

若是每次都人爲編排,又或是每新來一個同事就問你項目 D 怎麼構建、從新構建須要注意什麼...等等狀況,豈不是要崩潰?github

咱們經常會在開源項目中發現 Makefile,你是否有過疑問?golang

本章節會簡單介紹 Makefile 的使用方式,最後建議深刻學習segmentfault

怎麼解決

對於構建編排,Docker 有 Dockerfile ,在 Unix 中有神器 Make ....緩存

Make

是什麼

Make 是一個構建自動化工具,會在當前目錄下尋找 Makefile 或 makefile 文件。若是存在,會依據 Makefile 的構建規則去完成構建工具

固然了,實際上 Makefile 內都是你根據 make 語法規則,本身編寫的特定 Shell 命令等學習

它是一個工具,規則也很簡單。在支持的範圍內,編譯 A, 依賴 B,再編譯 C,徹底沒問題優化

規則

Makefile 由多條規則組成,每條規則都以一個 target(目標)開頭,後跟一個 : 冒號,冒號後是這一個目標的 prerequisites(前置條件)ui

緊接着新的一行,必須以一個 tab 做爲開頭,後面跟隨 command(命令),也就是你但願這一個 target 所執行的構建命令

[target] ... : [prerequisites] ...
<tab>[command]
    ...
    ...
  • target:一個目標表明一條規則,能夠是一個或多個文件名。也能夠是某個操做的名字(標籤),稱爲僞目標(phony)
  • prerequisites:前置條件,這一項是可選參數。一般是多個文件名、僞目標。它的做用是 target 是否須要從新構建的標準,若是前置條件不存在或有過更新(文件的最後一次修改時間)則認爲 target 須要從新構建
  • command:構建這一個 target 的具體命令集

簡單的例子

本文將以 go-gin-example 去編寫 Makefile 文件,請跨入 make 的大門

分析

在編寫 Makefile 前,須要先分析構建前後順序、依賴項,須要解決的問題等

編寫

.PHONY: build clean tool lint help

all: build

build:
    go build -v .

tool:
    go tool vet . |& grep -v vendor; true
    gofmt -w .

lint:
    golint ./...

clean:
    rm -rf go-gin-example
    go clean -i .

help:
    @echo "make: compile packages and dependencies"
    @echo "make tool: run specified go tool"
    @echo "make lint: golint ./..."
    @echo "make clean: remove object files and cached files"

一、在上述文件中,使用了 .PHONY,其做用是聲明 build / clean / tool / lint / help 爲僞目標,聲明爲僞目標會怎麼樣呢?

  • 聲明爲僞目標後:在執行對應的命令時,make 就不會去檢查是否存在 build / clean / tool / lint / help 其對應的文件,而是每次都會運行標籤對應的命令
  • 若不聲明:剛好存在對應的文件,則 make 將會認爲 xx 文件已存在,沒有從新構建的必要了

二、這塊比較簡單,在命令行執行便可看見效果,實現瞭如下功能:

  1. make: make 就是 make all
  2. make build: 編譯當前項目的包和依賴項
  3. make tool: 運行指定的 Go 工具集
  4. make lint: golint 一下
  5. make clean: 刪除對象文件和緩存文件
  6. make help: help

爲何會打印執行的命令

若是你實際操做過,可能會有疑問。明明只是執行命令,爲何會打印到標準輸出上了?

緣由

make 默認會打印每條命令,再執行。這個行爲被定義爲回聲

解決

能夠在對應命令前加上 @,可指定該命令不被打印到標準輸出上

build:
    @go build -v .

那麼還有其餘的特殊符號嗎?有的,請課後去了解下 +、- 的用途 🤩

小結

這是一篇比較簡潔的文章,但願可讓您對 Makefile 有一個基本瞭解

恭喜你必備技能 +1

參考

本系列示例代碼

本系列目錄

相關文章
相關標籤/搜索