内容简介:一种更好的方式是使用docker构建本地编译环境,可以非常方便的编译适合各个平台的程序版本原理很简单,就是利用官方提供的golang镜像,将本地的代码通过挂载的方式,挂载到容器中,然后再容器中编译即可。golang开发环境的镜像我们这里选择golang:1.8(也可以选择其他的镜像),这个镜像的目录结构为:
简介
很多时候我们本地开发环境和线上环境是不一致的,比如mac开发,linux运行。通常的做法如下:
本地开发->上传git->服务器拉取代码->编译->运行
时间久了会发现,这样非常麻烦。
一种更好的方式是使用 docker 构建本地编译环境,可以非常方便的编译适合各个平台的程序版本
原理
原理很简单,就是利用官方提供的golang镜像,将本地的代码通过挂载的方式,挂载到容器中,然后再容器中编译即可。
golang开发环境的镜像我们这里选择golang:1.8(也可以选择其他的镜像),这个镜像的目录结构为:
/go/bin
/go/src
他的gopath 为 /go
可以通过以下命令查看:
docker run --rm golang:1.8 go env
具体可以参考官方dockerfile文件,搜索gopath即可。
https://github.com/docker-library/golang/blob/9bf6daddb324a4d8e82b0613cf348a6eff363f95/1.10/stretch/Dockerfile因此,我们可以将本地的gopath映射到容器的/go目录(这样我们项目依赖的 go 包也会自动挂载到容器的gopath目录下)
将要编译的本地程序映射到容器的/go/src/myapp 目录下,然后执行编译即可。
举例
一条命令就可以搞定:
docker run -v "$GOPATH":/go --rm -v "$PWD":/go/src/myapp -w /go/src/myapp -e GOOS="darwin" -e GOARCH="amd64" golang:1.8 go build -v
解释下这句话的意思:
--rm :会在每次执行完编译后自动删除容器(不加这个参数,使用docker ps -a会看到我们上一次执行结束的容器)
-v "$GOPATH":/go:将本地gopath映射到容器中,这样容器中就不会提示缺少包
-v "$PWD":/go/src/myapp:将本地代码映射到容器中,本地代码目录为myapp
-e GOOS/-e GOARCH:指定编译平台,可以很方便的进行交叉编译
golang:1.8:镜像名称
这样,我们只需要在我们的代码目录下,增加一个脚本build.sh, 内容如下:
docker run -v "$GOPATH":/go --rm -v "$PWD":/go/src/myapp -w /go/src/myapp -e GOOS="darwin" -e GOARCH="amd64" golang:1.8 go build -v
可以根据需求,自己修改这个脚本。
然后再需要编译的时候,直接执行这个脚本就会在本地目录下生成编译好的二进制文件,非常方便
疑问
golang对交叉编译支持的很好,最简单的方式如下:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
不过对于某些项目,直接本地交叉编译经常报错,报错原因没有深究。还是采用本文所述方法,保持程序运行环境和编译环境一致最稳妥。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java Servlet & JSP Cookbook
Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99
With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!