Windows环境下 Go项目迁移至Ubuntu(WSL) 以部署filebeat为例
1、先在Ubuntu操作系统下,配置go语言环境【需要go build ,当然如果你是打算在外界编译成可执行文件,然后丢到wsl,可以不要配置go环境】
配置go流程如下:【注意,如果有旧版本,记得先删除,否则后面项目运行不起来】
报错:
Load redeclared in this block
①先拉包 :wget https://golang.google.cn/dl/go1.24.2.linux-amd64.tar.gz
中间的版本,可以随意更改,go.mod用的是1.24.2
②然后再解压:tar -xvzf go1.24.2.linux-amd64.tar.gz -C /usr/local/
③配置环境变量:
编辑用户的bashrc文件
nano ~/.bashrc
文件末尾加这三行
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
刷新
source ~/.bashrc
配置go env 【一般开启Module模式和更改proxy 】
默认官方直链,没梯子很慢。可以更换cn站点
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
2、完成以上操作go 可以正常使用了,我们切到项目下,直接go build 命令,自动帮我们下载依赖
当然,如果想更改版本,可以:go get package@version 指定版本
比如我在项目中需要更改filebeat的版本: go get github.com/elastic/beats/v7@v7.17.29
更改后,记得go mod tidy ,否则项目编译会报错
还有当你把go.mod文件删除后,重新go mod init + ModuleName ,也是需要go mod tidy的,否在会报错【当然,如果你go mod tidy 了还报错,就需要检查你当前路径是否在GOPATH下,如果在的话可以切换GOPATH路径,或者退出GOPATH路径,这也是Module模式和GOPATH模式的区别】
报错:
cannot determine module path for source directory
3、项目编译 :go build -o filebeat . 【-o 指定编译后的文件名称】
生成可执行文件后,还不能立即使用【这个时候只是普通文件】,我们还需要更改操作权限:
chmod 777 文件名
4、项目运行:当文件变成可执行文件后,通过命令 ./filebeat -e -c filebeat.yml执行程序
如果你的整个源码是通过从windows拖过来的,你的文件的拥有者可能只是普通用户,这个时候如果你是root用户,想执行这个可执行文件,可能会报错:
报错:error loading config file: config file ("filebeat.yml") must be owned by the user identifier (uid=0) or root
通过ll 可以查看当前路径下的文件的拥有者,如果不是现在本人,通过命令:
chown -R root:root 文件路径 【-R 表示递归 冒号前后表示用户以及用户组】
最后我还碰到一个报错:
runtime/cgo: pthread_create failed: Operation not permitted
SIGABRT: abort
通过查阅大量文档,最后解决方案是,提升filebeat的版本,通过我上面将的 go get 提升到了7.17.29解决问题。