公司项目中Makefile的使用

Makefile基本格式

target ... : prerequisites ...
command
...
...
  • target - 目标文件

  • prerequisites - 生成target所需要的文件

  • command - 需要执行的命令(shell命令),命令必须以【tab】开头

Makefile的规则:prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

注意:JetBrains家的idea Tab键默认按出来是四个空格构成而不是制表符。

设置方法:Preferences-》Code Style-〉Other File Types 中选择Use tab character 点击Ok。

伪目标&.PHONY

如果taget文件不存在,那么他会执行后面所定义的命令。这里我们只讨论伪目标,伪目标不会像真正的目标(target)一样生成一个目标文件。通常情况下.PHONY会与伪目标一起配合使用,目的是为了避免和同名文件冲突、改善性能。

如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。例如:
clean:
rm *.o temp
因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有依赖文件,文件"clean"始终是最新的,命令永远不会 执行;为避免这个问题,可使用".PHONY"指明该目标。如:
.PHONY : clean
这样执行"make clean"会无视"clean"文件存在与否。

go fmt ./…

go官方文档说明:./…代表在当前文件夹下和旗下所有子文件,除vendor目录下的文件。

那么这个命令的意思就是格式化当前文件夹下和旗下所有子文件(除vendor目录下的文件)

MakeFile如何忽略错误

在可能出错的命令前面加上-

如何一口气生成多个目标

Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它n个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那n个目标就总是不如“all”这个目标新。

Makefile文件事例

.PHONY: all format clean

all: clean format build-dev package

clean:
rm -f main main.zip

format:
go fmt ./...
-git clone https://github.com/golang/tools.git $(GOPATH)/src/golang.org/x/tools 2>/dev/null
go install golang.org/x/tools/cmd/goimports
$(GOPATH)/bin/goimports -local=gitlab.oifitech.com -l -w `find . -type f -name '*.go' -not -path './vendor/*'`

build-dev:
GOOS=linux go build -tags dev main.go

build-prod:
GOOS=linux go build -tags prod main.go

package:
go get -v github.com/aws/aws-lambda-go/cmd/build-lambda-zip
$(GOPATH)/bin/build-lambda-zip main