Ubuntu环境下编译并部署Go项目 | 青训营笔记

297 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

我在写结业项目搜索引擎时用到了jieba库,而这个库不支持交叉编译,所以我用了两天时间踩了各种坑才成功在Ubuntu环境下编译并部署,值得整理成一篇博客。

一些约定

Ubuntu版本:20.04

Go版本:1.18.1

Go 环境搭建

基础操作

如果直接通过apt来下载Go是无法下载到我们所需要的这样一个较新的版本,所以我们选择自主下载。

下载 Go

$ wget https://dl.google.com/go/go1.18.1.linux-amd64.tar.gz

当然如果没有梯子这条命令只能换来一个 timeout 的提示,此时我们有两个选择:

  • 换国内源

$ wget https://studygolang.com/dl/golang/go1.18.1.linux-amd64.tar.gz

  • 手动下载然后放到Ubuntu系统下的某个路径

解压安装 Go

我们先cd到下载或是存放刚刚得到的安装包的目录,然后通过命令解压到目标位置(即GOROOT目录):

$ sudo tar -zxvf go1.18.1.linux-amd64.tar.gz -C /usr/local/lib/

此时我们验证版本发现就是我们想要的1.18.1版本了。

配置环境变量

我们先打开全局变量配置文件:

$ vim ~/.profile

然后在末尾输入响应的环境配置:

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin

export GOPATH=/mnt/e/gowork
export PATH=$PATH:$GOPATH/bin

最后重新加载环境:

$ source ~/.profile

当然也可以通过下面的方法来配置:

$ sudo tee -a ~/.profile << EOF
> export GOROOT=/usr/local/go
> export GOPATH=/mnt/e/gowork
> export PATH=\$PATH:\$GOROOT/bin:\$GOPATH/bin
> EOF
$ source ~/.profile

配置 Go 的代理

因为墙的原因,国内想直接通过默认路径获取依赖是几乎不可以的,我们可以通过下面的命令来配置:

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

也可以这样:

$ sudo tee -a ~/.profile << EOF
> export GO111MODULE=on
> export GOPROXY=https://goproxy.cn,direct
> EOF
$ source ~/.profile

编译

将源码放到Ubuntu的某个目录下后,我们先cd到该目录。

然后执行

$ go build -o {project_name}

如果需要使用管理员命令 sudo 的话,就需要重新设置一遍 sudo go env 的proxy配置了(因为不知道管理员和普通用户权限有区别我在这一步上卡了一整天)。

编译好后就可以看到一个没后缀的文件了。

特殊情况

jieba库底层是用 C++ 编写的,所以在编译时需要 C++ 环境,我们需要执行:

$ sudo apt-get install g++

部署

这一步我们需要用到tmux,先下载安装:

$ sudo apt-get install tmux

然后运行:

$ tmux

这时我们会跳到一个新的窗口,cd到我们准备部署的根目录下,执行命令运行编译好的文件:

$ ./{project_name}

最后我们按下 ctrl+b d 或者输入命令来分离会话:

$ tmux detach

tmux 的一些常用操作

$ tmux new -s <session-name> //新建会话
$ exit //退出
$ tmux detach //分离会话
$ tmux ls //查看当前所有会话
$ tmux attach -t <session-name> //接入某个已存在的会话,也可以用会话id来代替会话名
$ tmux kill-session -t <session-name> //杀死某个会话,也可以用会话id来代替会话名
$ tmux switch -t <session-name> //切换会话,也可以用会话id来代替会话名
$ tmux rename-session -t 0 <new-name> //重命名会话0

tmux 的一些常用快捷键

Ctrl+b d:分离当前会话。
Ctrl+b s:列出所有会话。
Ctrl+b $:重命名当前会话。

一些其他的抱怨

jieba库是需要一个文件依赖的,而不知道为什么我在服务器端无法自动生成该文件依赖。WSL2上编译的程序也因为缺少依赖无法在服务器端正常处理请求。最终只能在代码里添加一个指定路径来存放这些文件依赖,然后拖来WSL2上自动生成的,这才能让项目跑起来,实在是有些反人类了。