Golang Go语言中的 Module 包管理

发布于 1周前 作者 yibo5220 来自 Go语言

Golang Go语言中的 Module 包管理

.
├── conf
│   ├── dev.ini
│   └── prod.ini
├── controller
│   ├── dir.go
│   ├── go.mod
│   └── go.sum
├── docs
├── go.mod
├── go.sum
├── main.go
├── pkg
│   ├── config
│   │   ├── config.go
│   │   ├── go.mod
│   │   └── go.sum
│   ├── ecode
│   │   ├── code.go
│   │   ├── ecode.go
│   │   ├── go.mod
│   │   └── msg.go
│   ├── os
│   │   ├── go.mod
│   │   └── path.go
│   └── response
│       ├── go.mod
│       ├── go.sum
│       └── response.go
├── routers
│   ├── go.mod
│   ├── go.sum
│   └── routers.go

一个测试项目的目录,有一些问题想要请教一下:

  1. 比如我在controller/dir.go中引入example.com/os,那么在controller/go.mod中需要指明replace example.com/os => ../pkg/os,相应的如果该项目的很多包就需要 replace 多次。
  2. 基于1,现在在main.go中引入example.com/controller包,则在go.mod不仅仅需要replace example.com/controller => ./controller,还需要replace example.com/os => ./pkg/os,一旦controller引入了多个,在此也需要引入多个包,感觉很麻烦,总感觉自己的姿势不对,但是查阅了资料除了将项目移到$GOPATH/src/或者使用$GOPATH以外,只能将代码上传到类似github.com的仓库上然后直接go get

刚接触 Go,包管理问题确实有被困扰到,想要探究一下究竟是怎么回事 :)


更多关于Golang Go语言中的 Module 包管理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

你只需要引用 go.mod 文件里面 module 的命名就行,该包下面的除了 internal 的内容,就都可以引用 了

更多关于Golang Go语言中的 Module 包管理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


<br>.<br>├── conf<br>│&nbsp;&nbsp; ├── dev.ini<br>│&nbsp;&nbsp; └── prod.ini<br>├── controller<br>│&nbsp;&nbsp; └── dir.go<br>├── docs<br>├── go.mod<br>├── go.sum<br>├── main.go<br>├── pkg<br>│&nbsp;&nbsp; ├── config<br>│&nbsp;&nbsp; │&nbsp;&nbsp; └── config.go<br>│&nbsp;&nbsp; ├── ecode<br>│&nbsp;&nbsp; │&nbsp;&nbsp; ├── code.go<br>│&nbsp;&nbsp; │&nbsp;&nbsp; ├── ecode.go<br>│&nbsp;&nbsp; │&nbsp;&nbsp; └── msg.go<br>│&nbsp;&nbsp; ├── os<br>│&nbsp;&nbsp; │&nbsp;&nbsp; └── path.go<br>│&nbsp;&nbsp; └── response<br>│&nbsp;&nbsp; └── response.go<br>├── routers<br>│&nbsp;&nbsp; └── routers.go<br>
刚刚尝试了一下,有一个自我认为比较方便的解决办法,go.mod中声明为module <a target="_blank" href="http://example.com/demo" rel="nofollow noopener">example.com/demo</a>,然后删掉所有子目录里的go.mod,现在不管是在哪里使用,只需要使用诸如import "<a target="_blank" href="http://example.com/demo/os" rel="nofollow noopener">example.com/demo/os</a>"import "<a target="_blank" href="http://example.com/demo/pkg/config" rel="nofollow noopener">example.com/demo/pkg/config</a>"这样就很便捷了。希望得到其他人的建议,我再综合一下

go mod 的本地引用确实挺蛋疼的 目前用的就是 replace 很不方便

这才是正确的做法,go mod 是可以直接引用本地的 pkg

为啥每个文件夹下都要建 go.mod, 把能公用的提出来就行了,不能公用没必要建 go.mod

Golang(Go语言)中的Module包管理是Go官方自1.11版本起推出的依赖管理工具,旨在简化包管理过程并支持版本控制。以下是对Go Modules的简要介绍:

Go Modules基于vgo演进而来,内置于Go命令行工具中(如go get、go build等),并逐渐成为Go包管理的标准方案。它主要包括go.mod和go.sum两个核心文件:

  • go.mod:定义了模块的名称、Go版本及依赖关系。通过该文件,可以清晰地看到项目所依赖的第三方包及其版本。
  • go.sum:记录了项目依赖的每个模块及其依赖项的确切版本和哈希值,确保构建时的安全性和一致性。

使用Go Modules,你可以轻松管理项目的依赖关系。初始化模块时,使用go mod init <module-name>命令;添加依赖时,使用go get <package-name>[@version]命令。此外,Go Modules还支持多种子命令,如go mod tidy(整理依赖)、go mod vendor(将依赖复制到vendor目录)等,以满足不同的包管理需求。

总之,Go Modules为Go语言提供了一个稳定、官方的包管理工具,极大地简化了依赖管理过程,并提高了项目的可维护性和安全性。

回到顶部