V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
iFurySt
V2EX  ›  Go 编程语言

关于 Go 的 Module 包管理

  •  
  •   iFurySt · 2020-11-10 10:32:10 +08:00 · 2171 次点击
    这是一个创建于 1509 天前的主题,其中的信息可能已经有所发展或是发生改变。
    .
    ├── 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,包管理问题确实有被困扰到,想要探究一下究竟是怎么回事 :)

    6 条回复    2020-11-11 08:52:31 +08:00
    bbao
        1
    bbao  
       2020-11-10 10:35:04 +08:00
    你只需要引用 go.mod 文件里面 module 的命名就行,该包下面的除了 internal 的内容,就都可以引用 了
    bbao
        2
    bbao  
       2020-11-10 10:37:33 +08:00
    iFurySt
        3
    iFurySt  
    OP
       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
        4
    AmrtaShiva  
       2020-11-10 11:01:37 +08:00
    go mod 的本地引用确实挺蛋疼的 目前用的就是 replace 很不方便
    axex
        5
    axex  
       2020-11-10 16:14:39 +08:00
    @iFurySt 这才是正确的做法,go mod 是可以直接引用本地的 pkg
    sxfscool
        6
    sxfscool  
       2020-11-11 08:52:31 +08:00
    为啥每个文件夹下都要建 go.mod, 把能公用的提出来就行了,不能公用没必要建 go.mod
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2730 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:55 · PVG 13:55 · LAX 21:55 · JFK 00:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.