为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
扬帆大鱼 2022-12-19 10:40:39
我正在使用按顶级语言组织的 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?
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

不是直接的,但有解决方法。

golang/go 中的这个问题

[...] 目前 HTTPS 服务器无法指示模块被前缀偏移src/go,因为那不是 Go 包路径的一部分。此布局不适用于go命令的内置git支持。

借助该go命令的内置git支持,导入规范以存储库的 URL 开头,后跟所需包的路径。因此路径必须相对于存储库根目录。使用虚荣导入路径,您可以根据需要使路径更长,但不能更短(例如example.com/pkg)。

因此,以下是没有解决方法的最短可能导入路径:go.example.com/go/<module>


解决方法

对于真正敬业的人。

这些涉及一些设置和额外的处理,可能不值得仅仅为了导入路径的美观。

我已经制定了两种方法(以及一种可能不适用于大量模块的半解决方案)。首先是设置模块代理。第二个是创建另一个从目录复制go并从那里导入的存储库。

使用replacego.mod

这个非常简单,您可以将基本导入路径设置为您喜欢的任何内容,并将replace其放在go.mod文件中。

缺点是管理许多相互依赖的模块变得复杂(如下一节的链接文章中所述)。也感觉不那么特别,负担在于要设置的导入项目而不是导入的项目。

Go 模块代理

这篇文章gist ) 很好地解释了这种方法。

go get使用GOPROXY环境变量来决定在哪里查找和解析包。基本思想是设置一个代理服务器,它知道如何翻译公共模块名称并从实际的 repo 中获取相关代码,然后将该服务器的 URL 放入GOPROXY变量中。

对于私有模块/存储库,这种方法需要格外小心,因为您还必须处理身份验证。

复制 Git 存储库

最后一种方法是将go目录的内容复制到另一个 repo,这可以通过 GitHub Actions 或类似工具自动完成。

要保留版本标签(如果使用)和分支(尽管不提交哈希),您可以使用git filter-repo重写历史,以便该go目录实际上是包根目录(并且一直是)git filter-repo --subdirectory-filter go/:。

然后只需将虚荣go-import标签设置为:

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

(原始回购协议所在的位置github.com/example/repo)。


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号