Golang – 如何编写Makefile

首先

由于在Golang开发中,通常会使用Makefile作为任务运行器,所以我们要整理一下它的写法。

范例

任务

执行任务

$ make taskname

任务设置


.PHONY: taskname
taskname:
    command

# 実行コマンド非表示
.PHONY: taskname
taskname:
    @command

# タスク定義が複数のコマンド
.PHONY: taskname
taskname:
    command1
    command2

# 複数コマンドをワンライナーで実行
.PHONY: taskname
taskname:
    command1 && command2

# 上のケースの別の方法
.PHONY: taskname
taskname:
    command1 ; command2 ;\
    command3

# タスクの前に別のタスクを実行
.PHONY: taskname3
taskname3: taskname1 taskname2
    command

# 自身のMakefileに定義してある別のタスク定義を実行
.PHONY: taskname2
taskname2:
    $(MAKE) taskname1
    command

关于.PHONY

如果存在与任务名相同的文件或目录,则任务不会执行。.PHONY可以省略,但定义它可以使任务在上述条件下执行,因此基本上建议写上。

变量

# 変数名=値
VAR=hello make
.PHONY: taskname
taskname:
    echo $(VAR)

# shell commandの実行結果を変数に格納
NOW=$(shell date)
.PHONY: taskname
taskname:
    echo $(NOW)

# シェルスクリプト変数・環境変数は$$で参照
.PHONY: taskname
taskname:
    VAR=$$GOPATH && echo $$VAR

# タスク実行中に環境変数を書き換えたい場合は、コマンド実行が1行終わるごとに環境変数がmakeコマンド実行時に戻る
.PHONY: taskname
taskname:
    export VAR="この値は消えてしまいます"
    echo VAR=$${VAR}

.PHONY: taskname
taskname:
    export VAR="この値は残ります" ;\
    echo VAR=$${VAR}

# サブディレクトリのMakefileのタスクを実行する
.PHONY: taskname
taskname:
    make -C sub_directory sub_task

# make実行時に変数の値を渡す(make task VAR=XXX)
VAR="これは上書きされる"
.PHONY: taskname
taskname:
    echo $(VAR) $$VAR

看一下OSS产品的Makefile。

Docker — 容器
Kubernetes — 容器编排工具
Terraform — 基础设施即代码工具
Gobot — 机器人开发框架
Gin — 网络框架

.PHONY在所有任务中被定义。

在参考的makefile中,所有任务都定义了.PHONY。

.PHONY: bin cover default dev e2etest fmt fmtcheck generate protobuf plugin-dev quickdev test-compile test testacc testrace tools vendor-status website website-test

我经常看到的任务

我经常看到以下的任务

    • fmt

 

    • test

 

    • lint/vet

 

    • clean

 

    help

任务的详细内容请备好shell。

有几个地方设置了shell来完成复杂的任务,Makefile仅负责执行。

如果使用ifeq进行条件分支

ifeq ($(XXX),y)
taskname:
    command1
else
taskname:
    command2
endif

请参考

如何编写使Go语言开发变得更便利的Makefile

广告
将在 10 秒后关闭
bannerAds