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