golang编译程序以及部署在ubuntu

3,507 阅读5分钟

#1 编译与部署

#1.1 windows上编译与部署

#cmd控制台到main.go文件目录下
 
set GOARCH=amd64
 
set GOOS=linux
 
go build main.go
 
#会生成一个没有后缀的二进制文件
 
main
 
#将该文件放入linux系统某个文件夹下
 
#赋予权限
 
chmod 777 main
 
#最后执行 ./main 就行了。
 
#如果想让项目在后台执行:执行 nohup ./main & ,这样就可以程序在后台运行了

#1.2 ubuntu上编译与部署

#1,把服务器上配置成本地一样的环境
 
#2,包括项目里面所依赖的包
 
#3,项目源码拷贝到与服务器,服务器上编译
 
go build main.go

vagrant@homestead:/var/gin_top/server$ go env -w GOPROXY=https://goproxy.cn,direct
vagrant@homestead:/var/gin_top/server$ sudo go build -o /var/www/gin-top/main main.go
 
#编译后会在同级目录生成可执行文件
 
main
 
#最后执行 ./main 就行了。
 
#如果想让项目在后台执行:执行 nohup ./main & ,这样就可以程序在后台运行了
 
#注意:发现如果按照官方给的安装方法只指定GOROOT的路径,于是自己新建一个目录gopath 作为GOPATH 的目录,
#并且设置环境变量(export GOPATH=/newhome/go/gopath)。在gopath下新建3个文件夹
#(模仿windows GOPATH的方式,也是go语言的工作环境目录)分别为 src、pkg、bin目录

#1.3 ubuntu上部署编译后的程序

#进入linux系统下刚刚上传文件的目录,使用权限命令

chmod 777 程序名称

#然后使用使程序在后台运行的命令

nohup ./程序名 &

#如果要关闭程序,可以使用命令”ps” 查看后台程序的pid,然后使用“kill 程序pid”命令,关闭程序比如程序名为test,可以用如下命令查询

ps aux|grep test

#需要在前台运行,直接

./程序名

#前台进程的挂起:

ctrl+Z //进程的终止

#后台进程的终止:

#方法一: 通过jobs命令查看job号(假设为num),然后执行kill %num
#方法二: 通过ps命令查看job的进程号(PID,假设为pid),然后执行kill pid

#前台进程的终止:

ctrl+c

#在Linux服务器上部署服务其他一些可能用到的命令有:

& 这个用在一个命令的最后,可以把这个命令放到后台执行 
ps 列出系统中正在运行的进程
kill 发送信号给一个或多个进程(经常用来杀死一个进程)
jobs 查看当前有多少在后台运行的命令
fg 将后台中的命令调至前台继续运行
如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg 将一个在后台暂停的命令,变成继续执行
如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

#1.4 supervisor上部署编译后的程序

supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。官方网站:supervisord.org/

常见配置如下:

[program:gin-top]
user=root
directory=/var/www/gin-top/
command=/var/www/gin-top/main
stdout_logfile=/var/www/gin-top/log/app-stdout.log
stderr_logfile=/var/www/gin-top/log/app-stderr.log
autostart=true
autorestart=true

使用步骤如下:

  1. 使用sudo service supervisor start启动supervisor服务;
  2. 创建应用配置文件/etc/supervisor/conf.d/gf-app.conf, 内容如上;
  3. 使用sudo supervisorctl进入supervisor管理终端;
  4. 使用reload重新读取配置文件并重启当前supoervisor管理的所有进程;
  5. 也可以使用update重新加载配置(默认不重启),随后使用start gf-app启动指定的应用程序;
  6. 随后可以使用status指令查看当前supervisor管理的进程状态;
## 启动
sudo supervisord

## 更新配置文件
sudo supervisorctl update

## 重启
sudo supervisorctl reload

## 查看状态
sudo supervisorctl status

## 如果报错 error: <class 'xmlrpclib.Fault'>, <Fault 6: 'SHUTDOWN_STATE'>: file: /usr/lib/python2.7/xmlrpclib.py line: 800
sudo supervisord -c /etc/supervisor/supervisord.conf
sudo supervisorctl reload

#2 go命令和常用工具

#GOPROXY
#Go1.11之后设置GOPROXY命令为:

export GOPROXY=https://goproxy.cn
#Go1.13之后GOPROXY默认值为https://proxy.golang.org,在国内是无法访问的,所以十分建议大家设置GOPROXY,这里我推荐使用goproxy.cn。

go env -w GOPROXY=https://goproxy.cn,direct

go install:编译并把编译好的结果移到$GOPATH/pkg或者$GOPATH/bin
go build :编译(项目和文件)
#常用参数:
-o 指定输出的文件名,可以带上路径,例如 go build -o out main.go
-i 安装相应的包,编译+go install
-v 打印出来我们正在编译的包名
 
go get:安装第三方包
#常用命令:
-d 只下载不安装
-u 强制使用网络去更新包和它的依赖包
-v 显示执行的命令
#运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
#运行go get -u=patch将会升级到最新的修订版本
#运行go get package@version将会升级到指定的版本号version
#如果下载所有依赖可以使用go mod download命令。
 
go clean:移除当前源码包和关联源码包里面编译生成的文件
 
go fmt:格式化代码
 
godoc:文档
godoc -http=:端口号 比如godoc -http=:8080然后打开127.0.0.1:8080可以在浏览器中查询pkg文档
godoc net/http:查看http包的文档
godoc -src fmt Printf:查看fmt.Printf的代码
 
go run 编译并运行Go程序


go mode 命令

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖

go list 命令
go list -m -f '{{if not .Indirect}}{{.Path}}{{end}}' all # 查看项目所有依赖包

#3 编译和部署命令

# 编译
go build -o ~/code/top/go_app/main main.go

# 设置权限
chmod 777 /var/www/html/go_app/main
# 关停supervisor中的main
supervisorctl stop gin-top:*
rm main
# 复制程序
mv /var/www/html/go_app/main main
# 开启supervisor的mian
supervisorctl start gin-top:*
#查看状态
supervisorctl status all
tail latest_log -f