所有Go项目必须置于GOPATH路径下吗?多场景配置咨询
嘿,我来帮你理清这个GOPATH的困惑~
首先直接回答你的核心问题:在Go 1.11之前的旧版本里,确实所有Go项目都必须放在$GOPATH/src下——这就是你遇到那个go get错误的原因:GOPATH模式下,Go需要明确知道源码的存放位置,以及依赖包的安装路径($GOPATH/pkg)和可执行文件输出路径($GOPATH/bin),如果你的项目不在$GOPATH/src下,它就找不到这些位置,自然报错。
但好消息是,Go 1.11之后推出了Go Modules(模块)功能,彻底摆脱了GOPATH的束缚,这也是现在Go开发的主流模式,完全能解决你的两个需求,我们先重点说这个:
用Go Modules解决你的需求
Go Modules是基于项目目录的,不需要把项目放在GOPATH里,甚至可以完全不设置GOPATH(当然设置了也不影响)。
1. 个人项目与工作项目分离
你完全可以把个人项目放在d:\home,工作项目放在x:\work,不需要任何额外的全局配置——只要在每个Go项目的根目录下初始化一个模块就行:
- 打开命令行,进入你的个人项目目录(比如
d:\home\bonjour),执行:
(模块名可以随便取,不一定是真实的GitHub地址,比如取go mod init github.com/yourname/bonjourpersonal/bonjour也完全没问题) - 同样,进入工作项目目录
x:\work\aurevoir,执行:go mod init company/aurevoir
初始化完成后,每个项目都会生成go.mod和go.sum文件,用来管理依赖,go get拉取的依赖会被Go缓存到全局目录(不需要你手动管),但每个项目的依赖版本是独立的,不会互相干扰。
2. 多语言项目共存
这个场景Go Modules简直是量身定做的:比如你有d:\home\domotique这个目录,里面既有Go项目dispatch,又有Python项目whatever,完全不需要调整目录结构——只要进入d:\home\domotique\dispatch,执行go mod init domotique/dispatch,之后就可以正常写Go代码、拉取依赖了,旁边的Python项目完全不受影响,你想怎么组织目录就怎么组织。
如果你必须用旧版GOPATH模式(不推荐)
如果因为某些原因你只能用Go 1.11之前的版本,也可以通过设置多个GOPATH来实现项目分离:
- 在Windows下,设置环境变量
GOPATH为多个路径,用分号分隔:set GOPATH=d:\home\go;x:\work\go - 然后把个人项目放在
d:\home\go\src\bonjour,工作项目放在x:\work\go\src\aurevoir,这样Go就能识别这些项目,go get也会把依赖安装到第一个GOPATH的pkg和bin目录里。
但还是强烈建议你升级到Go 1.11+并使用Go Modules,这是官方推荐的现代开发模式,能省掉很多目录结构的麻烦。
内容的提问来源于stack exchange,提问作者WoJ

