Go模块与封装

时间:2020-05-21 17:18:24

标签: go go-modules

刚刚开始学习Go模块。我对在同一模块内导入本地软件包有疑问。我正在查看的示例是此仓库:

https://github.com/Azure/azure-service-bus-go

模块为module github.com/Azure/azure-service-bus-go。该模块内部有一个单独的软件包atom(但它本身不是模块)。 当主包中的文件导入atom时,它们将像这样进行操作:import "github.com/Azure/azure-service-bus-go/atom"-以queue_manager.go为例。

我不太了解-GO如何知道查看本地atom软件包,而不是在Github上说一个?对我来说似乎令人困惑的是,远程/绝对URI引用了正在修改的模块中的某些内容。是否可以保证如果我修改本地磁盘上的文件并进行构建,实际上是在引用最新版本而不是已经推送的版本?

作为一个玩具练习,我试图创建一个不存在的Github URI的模块,实际上,go mod tidy确实试图与Github进行对比,即使实际上确实存在本地副本< / p>

3 个答案:

答案 0 :(得分:1)

go.mod 文件中的 module directive 声明了该模块中所有包的导入路径前缀。

如果你刚刚开始学习 Go 模块, Create a Go module 教程可能是一个不错的起点。

答案 1 :(得分:0)

谢谢。我正在迁移一个现有项目,并遇到更改软件包导入的问题。我现在正在工作

答案 2 :(得分:0)

我有一个类似的问题。我看到的答案似乎只适用于非常简单的目录结构。但是在大型项目中很容易得到复杂的结构。考虑这样的模块结构:

quotes/
    main.go
    go.mod
    handler/
        quoteshandler/
            quoteshandler.go
    middleware/
        ...
 

为了使用本地版本的包,我在顶级 go.mod 文件中使用了“replace”指令:

quotes/go.mod:
    ...
    replace "github.com/quotes-service" => ../quotes-service

但是在文件quoteshandler.go里面有导入语句:

import "github.com/quotes-service/quotes/middleware"

通过从github仓库下载middleware来满足这些导入依赖,这不是我想要的。我不知道如何简单地解决这个问题。似乎必须在模块的每个子目录中放置带有替换指令的 go.mod 文件。