如何将 Go 虚荣导入 URL 设置为 monorepo 中的存储库子目录?

我正在使用按顶级语言组织的 monorepo,因此所有 Go 模块都位于go存储库根目录中。我想设置一个指向go目录而不是存储库根目录的虚导入 URL,这样go/就不需要包含在导入路径中。


当前文件结构:


/

  go/

    module1/

    module2/

所需的导入格式:


import (

    "go.example.com/module1"

    "go.example.com/module2"

)

目前可能但不希望:


import (

    "go.example.com/go/module1"

    "go.example.com/go/module2"

)

根据文档<meta>,元素的格式go.example.com应为以下形式:


<meta name="go-import" content="import-prefix vcs repo-root">

所以在这种情况下我会:


<meta name="go-import" content="go.example.com git github.com/example/repo">

这会将 后面的import-prefix路径转换为相对于存储库根目录的路径,以便在存储库中go.example.com/this/path查找this/path目录。相反,我希望路径相对于 repo 中的go目录而不是 repo root。


有没有什么办法可以告知go get后面的路径go.example.com应该是相对于github.com/example/repo/go而不仅仅是github.com/example/repo?


扬帆大鱼
浏览 87回答 1
1回答

缥缈止盈

不是直接的,但有解决方法。从golang/go 中的这个问题:[...] 目前 HTTPS 服务器无法指示模块被前缀偏移src/go,因为那不是 Go 包路径的一部分。此布局不适用于go命令的内置git支持。借助该go命令的内置git支持,导入规范以存储库的 URL 开头,后跟所需包的路径。因此路径必须相对于存储库根目录。使用虚荣导入路径,您可以根据需要使路径更长,但不能更短(例如example.com/pkg)。因此,以下是没有解决方法的最短可能导入路径:go.example.com/go/<module>。解决方法对于真正敬业的人。这些涉及一些设置和额外的处理,可能不值得仅仅为了导入路径的美观。我已经制定了两种方法(以及一种可能不适用于大量模块的半解决方案)。首先是设置模块代理。第二个是创建另一个从目录复制go并从那里导入的存储库。使用replace于go.mod这个非常简单,您可以将基本导入路径设置为您喜欢的任何内容,并将replace其放在go.mod文件中。缺点是管理许多相互依赖的模块变得复杂(如下一节的链接文章中所述)。也感觉不那么特别,负担在于要设置的导入项目而不是导入的项目。Go 模块代理这篇文章(&nbsp;gist&nbsp;) 很好地解释了这种方法。go get使用GOPROXY环境变量来决定在哪里查找和解析包。基本思想是设置一个代理服务器,它知道如何翻译公共模块名称并从实际的 repo 中获取相关代码,然后将该服务器的 URL 放入GOPROXY变量中。对于私有模块/存储库,这种方法需要格外小心,因为您还必须处理身份验证。复制 Git 存储库最后一种方法是将go目录的内容复制到另一个 repo,这可以通过 GitHub Actions 或类似工具自动完成。要保留版本标签(如果使用)和分支(尽管不提交哈希),您可以使用git filter-repo重写历史,以便该go目录实际上是包根目录(并且一直是)git filter-repo --subdirectory-filter go/:。然后只需将虚荣go-import标签设置为:<meta&nbsp;name="go-import"&nbsp;content="go.example.com&nbsp;git&nbsp;github.com/example/repo-go">(原始回购协议所在的位置github.com/example/repo)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go