Go语言踩坑之旅

前言:友人寻我合做一个小网站。我们最终决定采用Go语言写后端。因此我开始了Golang踩坑之旅。

注:本文基于Go 1.13.7 。操作系统为Manjaro KDE 64位,下文golang等同于Go语言

以前,golang缺乏好用的包管理器,并且所有项目必须在GOPATH文件夹下组织。如此反直觉的开发方式让笔者在之前对GO浅尝辄止。在Go的1.11版本后,Go引入了go mod,在Go1.13版本go mod正式上位,成为默认的包管理器,正式名称为go modules(原名称为vgo)。
笔者在昨天clone了一个GO开源小项目,对其使用新的go mod管理,然而却遇到了比较严重的问题,下面复现一下问题,并解决。

首先,将项目clone到本地
git clone https://github.com/44670/ProjectSend.git
经过观察,我们可以知道这个项目没有采用go mod进行组织(判断方法:看目录中是否有go.mod文件)
执行gomod初始化命令
go mod init ProjectSend
我们尝试构建

坑点一:静态文件打包进二进制文件

在这里插入图片描述
报错啦,意思是未找到statik文件。我们知道这个项目采用statik工具,将网站需要的静态文件打包扔进二进制可执行文件(静态文件少的小网站,这样处理很轻松)。

解决方法:

我们需要用statik工具将static文件夹打包。
下载statik工具 go get github.com/rakyll/statik
用statik将静态文件文件夹打包成go文件~/go/bin/statik -src=static

搞定之后如下图
在这里插入图片描述好了,再次尝试构建
还是报错
本地包导入失败

坑点二:本地包导入

第一种解决方案

新的go mod要求导入第三方包的包名格式必须为网址格式,例如”github.com/rakyll/statik/fs”这种形式。
那么笔者新建一个github仓库,将statik文件push上去。(过程不再赘述)
修改main.go文件的第17行为_ "github.com/reedthink/FuckGoMod/statik",ok,再次尝试运行
成功~
在这里插入图片描述在这里插入图片描述某issue中提到import本地包的问题,官方回复“此问题是go mod的新要求,很抱歉但是以后都这样”。
好吧,那以后导入本地包又没有网络环境,改怎么办呢?当然还有Plan B:replace。
具体使用方法,且看下回分解


第二种解决方案

更新啦~
让我们把时间倒回到坑点二之前,开始使用另一种更合适的方法导入本地包

因为新版的go mod不再支持*.go文件中直接import本地个人包,但是我们可以使用go.mod的replace功能来实现。

首先,我们在main.go中import “github.com/reedthink/MyMod/pkgName”

自然,我们导入会失败,然后我们必须手动修改go.mod

1
2
3
4
5
require (
github.com/reedthink/MyMod v1.54.2
)

replace github.com/reedthink/MyMod => /home/hhh/FuckGoMod

ok,再次运行,成功!

附参考链接:https://segmentfault.com/a/1190000018398763?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com

gomod模式下调用项目内的包

不需要为子文件夹新建go.mod,我们只需要在导包时加入”当前文件夹/要导入的包所在的子文件夹”

例如: import "myList/models"

现在我的解决方案:

  • 项目内的包,直接使用上面的方法调用
  • 不在项目内的包,推送到github上
0%