那时候刚好下着雨,柏油路面湿冷冷的,还闪烁着青、黄、红颜色的灯火。



使用 Makefile 构建


使用 Makefile 构建

我们使用golang开发一些东西之后进行调试一般使用go run main.go查看结果,当到生产环境将会使用go build进行编译。编译完完之后把论据copy到指定目录。当然,这并没有什么问题,在少量的任务或参数的时候使用这种方式确实比较方便。当在一些复杂的任务当中如果依然使用这种方式的话,将会非常麻烦。

当然也有很多其他方式可以解决这个问题。比如写一个shell脚本来完成相关工作。

或者我们也可以尝试写一个makefile文件,使用系统自带的make命令来做相关事情。make 这个工具生来就是为了做这些事情,在 makefile 中我们可以将所有常见的任务都放在一起。

写一个makefile

makefile 能干的事情有很多,假设这个项目里包含了前端,React或VUE 等前端框架。

我们要对前端源码也进行编译。那么我们只要通过make命令就可以完成所有步骤了。

以我blog为例,执行make命令的目录下必须要有一个makefile 文件,我们所以的工作任务都会在makefile这个文件里。

参考: Makefile

APPNAME = blog
BIN = $(GOPATH)/bin
GOCMD = /usr/local/go/bin/go
GOBUILD = $(GOCMD) build
GOCLEAN = $(GOCMD) clean
GOTEST = $(GOCMD) test
GOGET = $(GOCMD) get
BINARY_UNIX = $(BIN)_unix
COPY = cp
PID = .pid

all: deps build

build:
	rm -rf $(bin)/$(APPNAME)
	$(GOBUILD) -o $(BIN)/$(APPNAME) -v
	$(COPY) -R conf/ $(BIN)/conf
	$(COPY) -R views/ $(BIN)/views
	$(COPY) -R static/ $(BIN)/static

test:
	$(GOTEST) -v ./...

clean:
	$(GOCLEAN)
	rm -f $(BIN)
	rm -f $(BINARY_UNIX)

dev:
	$(GOBUILD) -o $(BIN)/$(APPNAME) -v
	./$(APPNAME) & echo $$! > $(PID)
	
deps:
	$(GOGET) github.com/tools/godep
	$(BIN)/godep restore

build-linux:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -o $(BINARY_UNIX) -v
	
install-ui:
	@yarn install
	
run:
	$(BIN)/$(APPNAME) & echo $$! > $(PID)
	
restart:
	@echo restart the app...
	@kill `cat $(PID)` || true
	./$(APPNAME) & echo $$! > $(PID)
	
kill:
	@kill `cat $(PID)` || true
	

为了方便使用我在开头定义了一些变量,在下面将可非常方便的引用这些变量。

all: deps build run

当直接执行make的时候,后面不跟参数,它将执行all这个目录,all下面有写一个个目录,那么,它将先执行deps目录,再执行build目录

如果执行make deps,也就make后面跟了deps参数,那么它将执行deps的任务。

通常咱们编译的时候会使用go build这个命令对当前目录的main.go进行编译,然后将编译好的main放到bin/目录下,当然使用go install也是可以的。

看看 go build 会干些什么

  • 通过go build加上要编译的Go源文件名,我们即可得到一个可执行文件,默认情况下这个文件的名字为源文件名字去掉.go后缀。
  • 也可以国 -o 指定目录及文件名

先看看 go install会干些什么

  • go install 编译出的可执行文件以其所在目录名命名
  • go install 将可执行文件安装到与src同级别的bin目录下,bin目录由go install自动创建
  • go install 将可执行文件依赖的各种package编译后,放在与src同级别的pkg目录下.

启动项目

进入$GOPATH/src/github.com/lattecake/blog

然后执行make deps, 将依赖包download下来。这里我使用的是godep这个我做的依赖管理。

完成后再执行make build命令,将会启动项目,如下图所示。

执行make dev启动项目,并进行开发调试。

编译项目

执行make build命令,先将代码编译到GOPATH/bin目录下,然后再将模版、配制文件等相关文件放到GOPATH/bin目录下。

这样只要通过make build 简单的命令就可以完成。

如果项目开发是在一个系统上,而需要在另一个系统上运行,那么在 makefile 中包含一个交叉编译的命令是非常方便的。我通常在容器的 Linux 平台上运行二进制,所以 makefile 包含了 Linux 构建。

build-linux:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -o $(BINARY_UNIX) -v

当然,如果你使用了docker容器,还可以通过docker-build进行编译

docker-build:
	docker run --rm -it -v "$(GOPATH)":/go -w ~/go/src/github.com/lattecake/blog golang:latest go build -o "$(BINARY_UNIX)" -v

启动/停止/重启 项目

make run
make restart

活动管理可以看下刚刚所启动的项目。

尾巴

本文只对如何简单的使用make对项目进行构建做一个简单的介绍。make可以做的工作还有很多,我们只对它做了些简单的使用。make是一个非常好的构建工具。

可以针对不同的环境进行相应的处理,假设有多个服务,服务的编译顺序,启动顺序,相关依赖等。

makefile还可以有简单的逻辑。

深情按压, 小额赞赏, 您的赞赏就是我更新的动力。


 标签 , TAG , 啦啦