小聊:本次小白给大家带来Golang项目部署操作以及个人所遇问题和解决它们的方法。依然是一边实操演示一边写文稿,如遇相似问题却存有疑惑可留言。开发环境是Window,部署环境是Linux。开发工具为GoLand,部署服务器为阿里云。

1. 打包部署

1.1. 在开发环境打包1.2. 在服务器启动运行命令 2. go项目部署问题

2.1. 问题一:启动报错无法执行文件,打包类型错误2.2. 问题二:启动报错访问不到相对路径的文件2.3. 问题三:使用 fresh 热部署继续开发报错 随笔

1. 打包部署

1.1. 在开发环境打包

在项目main.go同级目录下,执行以下命令,局部设置打包环境

# 设置环境

set CGO_ENABLED=0

set GOOS=linux

set GOARCH=amd64

执行以下命令生成 main-app 打包文件

# 打包命令 main-linux 为打包文件名

go build -o main-app main.go

连接服务器,将 main-app 文件放入部署服务器的任意目录下

[root@iZwz9d9v06uh0jnrexcuk9Z sunnybook]# ll

-rw-r--r-- 1 root root 16535089 Nov 10 21:05 main-app

1.2. 在服务器启动运行命令

给项目二进制文件添加可执行权限

chmod +x main-app

// 或

chmod 773 main-app

[root@iZwz9d9v06uh0jnrexcuk9Z app]# chmod 773 main-app

[root@iZwz9d9v06uh0jnrexcuk9Z app]# ll

total 16148

-rwxrwx-wx 1 root root 16535089 Nov 10 20:07 main-app

启动执行(二进文件,可以直接运行)

./main-app

[root@iZwz9d9v06uh0jnrexcuk9Z app]# ./main-app

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.

Ctrl + C停止运行

后台启动

nohup ./main-app &

回车

[root@iZwz9d9v06uh0jnrexcuk9Z app]# nohup ./main-app &

[1] 19400

[root@iZwz9d9v06uh0jnrexcuk9Z app]# nohup: ignoring input and appending output to ‘nohup.out’

查看进程

netstat -lntp

停止运行(PID ——> 进程号)

kill PID

2. go项目部署问题

2.1. 问题一:启动报错无法执行文件,打包类型错误

[root@iZwz9d9v06uh0jnrexcuk9Z app]# chmod +x main-app

[root@iZwz9d9v06uh0jnrexcuk9Z app]# ./main-app

-bash: ./main-app: cannot execute binary file: Exec format error

回到开发环境编译器,go env 查看修改属性情况,发现并没有环境修改成功

go env

使用 全局 修改命令

# 设置环境

go env -w CGO_ENABLED=0

go env -w GOOS=linux

go env -w GOARCH=amd64

# 打包命令 main-linux 为打包文件名

go build -o main-app main.go

再次 go env 查看修改情况:修改成功

go env

2.2. 问题二:启动报错访问不到相对路径的文件

2022/11/10 20:22:35 Fail to parse ‘conf/app.ini’: open conf/app.ini: no such file or directory

读取不到文件,因为以下代码:

Cfg, err = ini.Load("conf/app.ini")

if err != nil {

log.Fatalf("Fail to parse 'conf/app.ini': %v", err)

os.Exit(1)

}

读取文件是使用的是相对目录,在开发环境是没问题的,但是一旦打包成二进制文件正式部署时就会有问题。

一般来说有两种做法,拼接路径和新建文件夹。

拼接路径比较麻烦一点,它不是普通意义上的把父级路径拼接上当前路径,这样做是没有意义的。

新建文件夹就简单多了,它不是找不到相对路径么,我们直接把文件资源再复制一份到对应的服务器位置就能访问到了。

如下:

[root@iZwz9d9v06uh0jnrexcuk9Z app]# ll

drwxr-xr-x 2 root root 4096 Nov 1 20:25 conf

-rwxr-xr-x 1 root root 16612864 Nov 10 20:33 main-app

2.3. 问题三:使用 fresh 热部署继续开发报错

fork/exec tmp\runner-build.exe: This version of %1 is not compatible with the version of Windows you’re running. Check your computer’s system information and then contact the software publisher.

把 GOOS=linux 改回 GOOS=windows 后正常

go env -w GOOS=windows

# 再次启动项目成功

fresh

下次打包时只需要改回 go env -w GOOS=linux 即可,来回如此。

随笔