1。Go官方在Gov1.11中加入了GoModules模式,并将持续到Gov1.16。每个版本的GoModules模式都会有一些变化。但是,当我们的项目使用GoModules模式时,还是会遇到一些问题。直到Gov1.18版本中新的Workspaces模式,解决了GoModules模式的这些问题。在本文中,我们将介绍如何使用Workspaces模式。2.简介当项目中需要导入一些私有的Git仓库或者还没有发布到Git仓库的依赖,或者需要修改三方依赖模块的代码时,一般的解决方法是将代码下载到本地,在go.mod文件中使用GoModules模式下的replace命令替换为本地目录路径。因为go.mod文件也是和项目一起提交到Git仓库的,每个开发者的本地目录路径可能不同,所以需要手动替换从远程仓库拉取的go.mod文件中的目录路径后替换成你自己的本地目录路径,就可以正常使用了。3.如何使用在介绍如何使用Workspaces模式之前,我们需要使用GoModules模式创建一个Go项目,我们的Go项目依赖于模块golang.org/x/example。创建Go项目#进入Home目录cd~#创建工作空间目录mkdirworkspace#进入工作空间目录cdworkspace#创建Go项目所在目录mkdirhello#进入Go项目所在目录cdhello#初始化gomodinitgithub.com/weirubo/hello#添加依赖gogetgolang.org/x/example#创建一个main.go文件touchmain.go示例代码:packagemainimport("fmt""golang.org/x/example/stringutil")funcmain(){str:="hello"reverseStr:=stringutil.Reverse(str)fmt.Println(reverseStr)}输出结果:gorunmain.goolleh看了上面的段落,我们已经很熟悉了和使用GoModules模式创建Go项目的操作步骤,接下来我们介绍如何使用Workspaces模式。创建工作空间#进入Home目录下的工作空间目录cd~/workspace#初始化工作空间goworkinit./hello执行上面的命令后,我们可以发现在工作空间目录下已经创建了一个go.work文件。查看文件,我们可以发现它包含两条指令,分别是go和use。go1.19use./hellogo命令指定使用哪个版本的Go来编译项目,类似于go.mod文件中的go命令。use命令表示hello目录下的模块是构建项目时的主模块。创建工作空间后,我们进入工作空间目录,运行main.go文件。cd~/workspacegorunhello/main.go输出:olleh但是,如果我们进入主目录(在工作区之外),我们将运行main.go文件。cd~gorunworkspace/hello/main.go输出:workspace/hello/main.go:5:2:norequiredmoduleprovidespackagegolang.org/x/example/stringutil:go.modfilenotfoundincurrentdirectory或者任何父目录;请参阅“转到帮助模块”。我们可以在输出中发现Go找不到项目使用的依赖模块。原因是我们在工作空间外运行Go项目,Go找不到需要的模块。4.使用场景在学习了使用Workspaces模式后,我们使用该模式来解决Part02中提到的问题。假设我们要在Go项目的依赖模块golang.org/x/example中添加一个函数ToUpper。当Go不提供Workspaces模式时,我们需要将依赖下载到本地,然后在本地修改下载的依赖文件。cd~/workspace/hellogit克隆https://go.googlesource.com/example#editgo.modgomodedit-replacegolang.org/x/example@v0.0.0-20220412213650-2e68773dfca0=/Users/frank/workspace/hello/example此时,我们可以修改我们下载到本地/Users/frank/workspace/hello/example/stringutil/reverse.go的依赖文件,添加函数ToUpper。funcToUpper(sstring)string{r:=[]rune(s)fori:=ranger{r[i]=unicode.ToUpper(r[i])}returnstring(r)}然后我们可以使用Use这个函数在main.go文件中。...toUpperStr:=stringutil.ToUpper(str)fmt.Println(toUpperStr)...输出结果:cd~/workspace/hellogorunmain.goHELLO使用GoModules模式的replace命令,虽然可以实现我们的需求,但是,当项目代码在别人的电脑上运行时,必须手动修改为自己的目录路径才能正常运行。使用Workspaces模式我们使用Go1.18提供的Workspaces模式来实现我们的需求。将下载好的依赖模块example添加到工作区:cd~/workspacegoworkuse./hello/example我们使用goworkuse命令将example模块添加到工作区,我们就可以使用我们下载到本地的依赖的代码了模块示例,而不是GOMODCACHE中示例模块的代码。我们的项目组成员只需要维护自己的本地工作空间,不需要在go.mod文件中的replace命令中手动修改本地目录路径。5.总结在本文中,我们首先描述了使用GoModules模式面临的一些问题,然后介绍如何使用Gov1.18中新的Workspaces模式,最后介绍如何使用Workspaces模式解决Go中的问题。通过示例进入模块模式。需要注意的是,go.work文件不要推送到远程仓库,我们可以将其添加到.gitignore文件中。我们在本文中使用的命令是goworkinit和goworkuse。此外,还有其他命令。有兴趣的读者可以执行命令gohelpwork了解更多。
