Home / PostsPost
使用 Makefile 构建
嘟噜聪2018/01/20 17:35:30 6057人已阅
简介 我们使用golang开发一些东西之后进行调试一般使用`go run main.go`查看结果,当到生产环境将会使用`go build`进行编译。编译完完之后把论据copy到指定目录。当然,这并没有什么问题,在少量的任务或参数的时候使用这种方式确实比较方便。当在一些复杂的任务当中如果依然使用这种方式的话,将会非常麻烦。
使用 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还可以有简单的逻辑。
深情按压, 小额赞赏, 您的赞赏就是我更新的动力。
很赞哦! (214)
上一篇:加密解密
文章评论
点击排行
本栏推荐
标签
站点信息
- 微信公众号