Go modules v2项目如何保持导入路径与原有目录结构匹配
Go项目v2版本正确实现方案
问题根源
你之前出现cannot find module错误的核心原因是:Go模块的导入路径需要和模块实际存放的目录结构匹配,你将v2目录放在仓库根目录,但go.mod里写了带project段的路径,Go工具链无法在对应路径下找到模块内容。
方案1:基于分支管理(推荐,无需调整目录结构)
如果不想改动现有目录结构,同时实现v2导入路径为原路径末尾加v2,可以使用基于分支/标签的版本管理方案,这也是Go官方支持的语义化版本管理方式:
- 从现有主分支创建新的v2开发分支,不需要新增任何v2目录
- 修改
project/go.mod的模块路径为github.com/my/coolproject/project/v2 - 批量替换项目内所有内部导入语句,将
github.com/my/coolproject/project/xxx统一替换为github.com/my/coolproject/project/v2/xxx - 测试验证通过后,在v2分支打
v2.0.0的版本标签推送到远程仓库即可
这种方案下,用户导入v2版本的路径就是你需要的github.com/my/coolproject/project/v2,和v1版本的导入路径前缀完全一致,目录结构也不需要做任何调整。
方案2:基于子目录管理
如果你更倾向于用物理目录区分不同版本,按如下操作即可匹配导入路径:
- 在
project目录下新建v2子目录,将原project目录下的所有业务代码(file1.go、go.mod、package1等)全部复制到project/v2目录下 - 修改
project/v2/go.mod的模块路径为github.com/my/coolproject/project/v2 - 批量替换
project/v2目录下所有内部导入语句,添加v2后缀即可
这种方案下v2版本的物理目录和导入路径完全匹配,也可以实现你要的导入路径规则。
方案3:根目录存放v2(导入路径前缀和v1不同)
如果你坚持把v2目录放在仓库根目录,就只能将v2的go.mod模块路径改为github.com/my/coolproject/v2,此时v2的导入路径和v1前缀不同,但可以正常运行,适合愿意调整导入路径规则的场景。
内容的提问来源于stack exchange,提问作者Petr Nechvátal
相关产品推荐
相关产品推荐

