大家好,我是建宇。Go的依赖管理,也称为GoModule。上线有一定年头了,投诉也不少,官方也在不断完善中。Go1.18会引入一个新特性:Multi-ModuleWorkspaces,用于支持Module多个工作空间,可以解决以往的一系列问题。今天建宇就带大家深入学习一下。背景在日常使用Go项目的时候,总会遇到两个经典的问题,特别让人头疼。如下:依赖本地替换模块。取决于本地未发布的模块。replacemodule第一种场景:比如在Go项目中,我们通常会解决一些本地依赖或者自定义代码。将在go.mod文件中使用replace来进行替换。如下代码:替换golang.org/x/net=>/Users/eddycjy/go/awesomeProject这样就可以实现本地开发联调的准确性。问题来了:本地路径:setreplace本质上是转换本地路径,也就是每个人都不一样。仓库依赖:文件修改会上传到Git仓库。如果不小心上传了,会影响到其他开发的同学,或者每次上传都得改回来。用户体验非常糟糕且令人沮丧。Unpublishedmodule第二种场景:在做本地Go项目开发时,可能会在本地同时开发多个库(项目库、工具库、第三方库)等。代码如下:packagemainimport("github.com/eddycjy/pkgutil")funcmain(){pkgutil.PrintFish()}如果此时运行gorun或gomodtidy,会失败,运行将失败。类似报错如下:fatal:repository'https://github.com/eddycjy/pkgutil/'notfound报这个问题是因为github中不存在库github.com/eddycjy/pkgutil,所以在自然拉不到。解决方案:在Go1.18之前,我们会使用replace(会遇到后台1的问题),或者直接上传到Github,Go工具链自然可以拉取依赖。很多同学会灵魂拷问:难道Go的所有依赖都要上传到GitHub上吗,强绑定?对新人很不友好,很可怕。经过社区的多轮反馈,MichaelMatloob提出了一个提案《Proposal: Multi-Module Workspaces in cmd/go》,经过大量讨论和实施,并在Go1.18正式实施。新提案的一个核心概念是加入了goworkworkspace的概念,针对的是GoModule的依赖管理模式。它可以在本地项目的go.work文件中设置一系列依赖的模块本地路径,然后将该路径下的模块组成一个当前工作空间,其读取优先级最高。我们可以通过gohelp查看,如下:$go1.18beta1helpworkUsage:gowork
