【问题标题】:Go Modules vs PackageGo 模块与包
【发布时间】:2022-04-29 22:11:57
【问题描述】:

刚开始学习 Go 模块。我有一个关于在同一个模块中导入本地包的问题。我正在查看的示例是这个 repo:

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 如何知道查看本地原子包,而不是说 Github 上的那个?让我感到困惑的是,作为被修改模块的一部分的东西被远程/绝对 URI 引用。是否可以保证,如果我修改本地磁盘上的文件并构建,我实际上引用的是最新版本,而不是已经推送的内容?

作为一个玩具练习,我尝试使用不存在的 Github URI 创建一个模块,而事实上go mod tidy 确实试图在 Github 上查找它,尽管实际上确实存在本地副本

【问题讨论】:

  • 因为 go.mod 文件。 go.mod 文件包含模块的全名,因此构建系统知道不远程查找该模块中的包。为您的项目运行go mod init
  • How to Write Go Code 带您通过一个示例模块演示其工作原理

标签: go go-modules


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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语句:

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

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

    【讨论】:

    • 用问题来提出问题,而不是回答。当您提出问题时,请在 go.mod 文件中显示模块语句。
    【解决方案3】:

    • module 是 go 包的集合。
    • package 是 .go 文件的目录。使用包,你可以组织你的 将代码转换为可重用的单元。
    • 我们可以添加一个模块去项目或升级模块版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-22
      • 2019-02-01
      • 2018-04-21
      • 1970-01-01
      • 2021-12-14
      • 2021-07-03
      • 2019-04-30
      • 2017-03-25
      相关资源
      最近更新 更多