makefile与go项目入门

海生

前言:make

make是一个构建自动化工具,会在当前目录下寻找Makefile或makefile文件。如果存在相应的文件,它就会依据其中定义好的规则完成构建任务。

一、Makefile介绍

  1. 我们可以把Makefile简单理解为它定义了一个项目文件的编译规则。
  2. 借助Makefile我们在编译过程中不再需要每次手动输入编译的命令和编译的参数,可以极大简化项目编译过程。
  3. 同时使用Makefile也可以在项目中确定具体的编译规则和流程,很多开源项目中都会定义Makefile文件。

1.1 规则概述

Makefile 由多条规则组成,每条规则主要由两个部分组成,分别是依赖的关系和执行的命令。
其结构如下所示:

[target] ... : [prerequisites] ...
<tab>[command]
    ...
    ...

其中:

  • targets:规则的目标
  • prerequisites:可选的要生成 targets 需要的文件或者是目标。
  • command:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。

1.2简单的例子

创建一个新目录,并在该目录中创建一个名为Makefile的文件。如下:

.
└── Makefile

打开Makefile,添加一个target命名hello到这个Makefile里面。

hello:
    echo "Hello"

我们尝试使用make命令行工具执行它:

➜ make hello
echo "Hello"
Hello

为什么会打印执行的命令?
如果你实际操作过,可能会有疑问。明明只是执行命令,为什么会打印到标准输出上了?
原因
make 默认会打印每条命令,再执行。这个行为被定义为回声
解决
可以在对应命令前加上 @,可指定该命令不被打印到标准输出上

hello:
    @echo "Hello"

我们尝试使用make命令行工具执行它:

➜ make hello
Hello

此时没有打印出命令了,只有执行的结果。

二、一个简单的go项目应用

我们在目录下新建一个main.go文件,代码如下:

package main

import "fmt"

func main() {
    fmt.Println("Hello")
}

我们可以执行一下 go run 命令

➜ go run ./main.go
Hello

或者编译一下 go build 命令

go build -o hi ./main.go

三、用Makefile编译go项目

我们把上面的go run 和go build 命令加到Makefile文件如下:

hello:
    echo "Hello"
run:
    go run ./main.go
build:
    go build -o hi ./main.go

现在我们执行一下make run

➜ make run
go run ./main.go
Hello

再执行一下 make build

➜  make build
go build -o hi ./main.go

现在我们改造一下 build target
我们把buid 改成 GOOS=linux GOARCH=amd64 go build -o hi ./main.go
如下:

hello:
    echo "Hello"
run:
    go run ./main.go
build:
    GOOS=linux GOARCH=amd64 go build -o hi ./main.go

在执行一下

➜  make build
GOOS=linux GOARCH=amd64 go build -o hi ./main.go

好处是 现在只要一个命令,就可以代替很多参数了。

四、用Makefile构建组合target

hello:
    echo "Hello"
run:
    go run ./main.go
build:
    GOOS=linux GOARCH=amd64 go build -o hi ./main.go
world:
    echo "世界"
hello-world-build:
    make hello
    make world
    make build

执行一下 make hello-world-build

make hello
echo "Hello"
Hello
make world
echo "世界"
世界
make build
GOOS=linux GOARCH=amd64 go build -o hi ./main.go

我们可以用组合语法 [prerequisites]

[target] ... : [prerequisites] ...
<tab>[command]
    ...
    ...

重构如下:

hello:
    echo "Hello"
run:
    go run ./main.go
build:
    GOOS=linux GOARCH=amd64 go build -o hi ./main.go
world:
    echo "世界"

hello-world-build:hello world build

执行一下 make hello-world-build

➜ make hello-world-build
echo "Hello"
Hello
echo "世界"
世界
GOOS=linux GOARCH=amd64 go build -o hi ./main.go

我们发现同时执行了

make hello
make world
make build

这就是组合命令。

阅读 110

与黑夜里,追求那一抹萤火。

33 声望
5 粉丝
0 条评论

与黑夜里,追求那一抹萤火。

33 声望
5 粉丝
文章目录
宣传栏