Navigation
阅读进度0%
No headings found.

Go 包管理与 GOPATH 配置详解

December 19, 2024 (1y ago)

Go
GOPATH
Package Management

关于包的使用,这片文章说的非常的详细 如何控制和管理pkg, 这里我们只是作为它的补充和总结,不包括一些详细的细节说明,如果你有需要请自行前往查看

go install 和 go get 有何种区别?

GOPATH是一个环境变量,用来表明你写的go项目的存放路径

GOPATH路径最好只设置一个,所有的项目代码都放到GOPATHsrc目录下。

GOPATH

是什么?如何运行?

顾名思义,它是一个路径,在进行Go语言开发的时候,我们的代码总是会保存在GOPATH/src</font>**<font style="color:rgb(51, 51, 51);">目录下。在工程经过 </font>**<font style="background-color:rgb(247, 247, 247);">go build</font>****<font style="color:rgb(51, 51, 51);">、</font>****<font style="background-color:rgb(247, 247, 247);">go install</font>****<font style="color:rgb(51, 51, 51);">或</font>****<font style="background-color:rgb(247, 247, 247);">go get </font>**<font style="color:rgb(51, 51, 51);">等指令后,会将下载的第三方包源代码文件放在</font>**<font style="color:#E8323C;background-color:rgb(247, 247, 247);">GOPATH/src目录下, 产生的二进制可执行文件放在 ****GOPATH/bin</font>**<font style="color:rgb(51, 51, 51);">目录下,生成的中间缓存文件会被保存在 </font>**<font style="color:#E8323C;background-color:rgb(247, 247, 247);">GOPATH/pkg 下。

如果我们使用版本管理工具(Version Control SystemVCS。常用如Git)来管理我们的项目代码时,我们只需要添加$GOPATH/src目录的源代码即可。binpkg 目录的内容无需版本控制。

关于GOPATH我们应该依据实际的项目啦,但是比较通用的方案就是上述的方案了

Mac下的设置

对于非M1来说,设置非常的简单

sudo  vim ~/.bash_profile
 
# 需改GOPATH 的路径,譬如在这里我把路径修改到了 /Volumes/WD_BLACK/origin/go
 
# 执行修改 
source ~/.bash_profile

然后我把个人的项目全部划分到了github/BM-laoli/下,这样我的所有的go的项目都能够在get上找到所有的pkg 方便大家使用。

什么样的配置才是好的配置?

没有银弹!,只有合适

个人开发者建议目录配置:

企业开发中推荐的配置:

其他流行的方案:

Go语言中也是通过包来组织代码文件,我们可以引用别人的包也可以发布自己的包,但是为了防止不同包的项目名冲突,我们通常使用顶级域名来作为包名的前缀,这样就不担心项目名冲突的问题了。

因为不是每个个人开发者都拥有自己的顶级域名,所以目前流行的方式是使用个人的github用户名来区分不同的包。

// 举个例子:张三和李四都有一个名叫studygo的项目,那么这两个包的路径就会是:
import "github.com/zhangsan/studygo" 
// 和
import "github.com/lisi/studygo" 
 
// 以后我们从github上下载别人包的时候,如:
go get github.com/jmoiron/sqlx 
// 那么,这个包会下载到我们本地GOPATH目录下的src/github.com/jmoiron/sqlx。

我最终的目录配置:

我使用了github 个人开发者推荐的配置

我们拿到一个项目如何run?

如果你从github拿到我的项目,切换到3-go-modules 分支进入c2 你发现这里的代码结构上这样的

如果你留意我在 第一篇文章基础中有设置的module name 你会发现这里有这样的配置 在go.mod中

// main.go
package main
 
import (
	"c2/modl/pkg/model"
	"c2/modl/pkg/utils"
	"fmt"
)
 
func main() {
	fmt.Println("222")
	model.GetModalName()
	utils.GetUtilsName()
 
}
 
//go.mod
module c2/modl
 
go 1.17
 

我想通过上述的表达你应该懂我这个东西如何使用,需要注意的是 这里我起的包的名字不好

c2/modl 具体来说我应该这样命名 和path 保持一致, 这件事应该在你的go mod init 的时候就做,当然了现在这样

也是无所谓的

module github.com/BM-laoli/go-laraen

如果你更新了某写pkg 你需要执行 tidy,verify来验证和重新载入依赖关系

go mod verify
go mod tidy

版本Version问题

go的依赖version 社区提供了很多方案,比较常用的就是

glide 具体去看官方说明和文档就行了,我这里只是简单的说说,其实也没必要用,因为go官方目前已经给出了解决方案