【问题标题】:Go module for multiple packages, with new major number >1用于多个包的 Go 模块,新的主要编号 >1
【发布时间】:2020-04-30 21:26:54
【问题描述】:

我正在尝试迁移现有的 Go 项目以使用模块,但在确定正确的目录结构时遇到了困难。该 repo 包含两个常规包(p1、p2)以及演示如何使用这些包的示例程序。我正在使用 Go 1.13。

当前布局是

<reponame>
   |
   +---  p1
   |     |
   |     +-- p1a.go
   |     +-- p1b.go
   |
   +---  p2
   |     |
   |     +-- p2a.go
   |     +-- p2b.go
   |
   +--  examples
         |
         +-- e1.go (which refers to packages p1 and p2)

github 存储库已经公开,版本标签 > 1。我知道我需要一个新的主要编号 v5,所以看起来我需要在包路径中的某个位置使用 v5。

但是应该是&lt;repo&gt;/v5/p1 还是&lt;repo&gt;/p1/v5? go.mod 文件在哪里?我怀疑我需要一个来覆盖这两个包,一个用于示例程序。

我能找到的版本 > 1 的所有示例似乎在模块中只有一个包。

重要的是,我如何让示例编译和运行?我已经为示例尝试了 go.mod 文件的各种排列,但即使使用“replace”指令尝试指向本地,它们也都失败并出现“查询'v5'没有匹配的版本”之类的错误目录。

在我进行本地测试之前,它似乎希望 v5 版本的代码已经发布到 github。

【问题讨论】:

    标签: go module


    【解决方案1】:
    1. 模块是关于版本控制的。如果 p1、p2 和 example 的版本一起,则将 go.mod 放在 repo 级别。这可能就是你想要的。

    2. 确保模块正确声明自己,即 go.mod 文件中的 module &lt;repo&gt;/v5

    3. 您确实不需要 需要文件系统路径中的v5。基本上有三种方式:一个包含 v5 内容的 v5 文件夹,一个包含 v5 内容的 v5 分支,或者两者都没有,在这种情况下,您的 repo 将仅是 v5。

    4. 确保导入路径正确。例如。在包示例中,您必须通过 import "&lt;repo&gt;/v5/p1" 导入 p1。 (对于 p2 甚至 p1 导入 p2 等也是如此)

    就是这样。

    cd 进入示例文件夹,go build:Go 将在文件系统树中查找 go.mod,并在 repo 根目录中找到它。因此它知道这个包属于模块&lt;repo&gt;/v5,因此可以从模块&lt;repo&gt;/v5 中找到所有包,并且可以在不需要任何替换指令的情况下导入&lt;repo&gt;/v5/p1。像这样,您可以在 v5 上本地工作,而无需推送到远程仓库。

    (一个常见的错误是没有声明模块为v5:在go.mod文件中你必须有一行module github.com/&lt;user&gt;/&lt;repo&gt;/v5。如果你错误地写了模块github.com/&lt;user&gt;/&lt;repo&gt;然后在编译时例如编译器认为“好吧,examples 包属于模块 github.com/&lt;user&gt;/&lt;repo&gt; 并且我应该导入 github.com/&lt;user&gt;/&lt;repo&gt;/v5/p1 所以让我们看看 github.com// 看看我们在那里找到什么......”并且找不到任何东西并且抱怨。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多