这是我参与「第三届青训营 -后端场」笔记创作活动的第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上自动生成的,这才能让项目跑起来,实在是有些反人类了。