关于 Go 的 Module 包管理

2020-11-10 10:32:10 +08:00
 iFurySt
.
├── 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,包管理问题确实有被困扰到,想要探究一下究竟是怎么回事 :)

2143 次点击
所在节点    Go 编程语言
6 条回复
bbao
2020-11-10 10:35:04 +08:00
你只需要引用 go.mod 文件里面 module 的命名就行,该包下面的除了 internal 的内容,就都可以引用 了
bbao
2020-11-10 10:37:33 +08:00
iFurySt
2020-11-10 10:48:27 +08:00
```
.
├── conf
│   ├── dev.ini
│   └── prod.ini
├── controller
│   └── dir.go
├── docs
├── go.mod
├── go.sum
├── main.go
├── pkg
│   ├── config
│   │   └── config.go
│   ├── ecode
│   │   ├── code.go
│   │   ├── ecode.go
│   │   └── msg.go
│   ├── os
│   │   └── path.go
│   └── response
│   └── response.go
├── routers
│   └── routers.go
```
刚刚尝试了一下,有一个自我认为比较方便的解决办法,`go.mod`中声明为`module example.com/demo`,然后删掉所有子目录里的`go.mod`,现在不管是在哪里使用,只需要使用诸如`import "example.com/demo/os"`,`import "example.com/demo/pkg/config"`这样就很便捷了。希望得到其他人的建议,我再综合一下
AmrtaShiva
2020-11-10 11:01:37 +08:00
go mod 的本地引用确实挺蛋疼的 目前用的就是 replace 很不方便
axex
2020-11-10 16:14:39 +08:00
@iFurySt 这才是正确的做法,go mod 是可以直接引用本地的 pkg
sxfscool
2020-11-11 08:52:31 +08:00
为啥每个文件夹下都要建 go.mod, 把能公用的提出来就行了,不能公用没必要建 go.mod

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/723484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX