GoLand中旧工程导入飘红处理思路

对于绝大多数新的 Go 项目而言,因为使用 go modules 管理包依赖从而无需要关注工程的目录位置,但是对于一些旧/历史工程在导入 GoLand 之后会出现全面飘红,这个时候就需要逐一排查问题

所属分类 Golang

相关标签 依赖GoPathGoLand

问题阐述

Go 语言在依赖包管理一共经过三个重要阶段:仓库模式、vendor、modules,关于这三个模式在另一篇文章中有详细介绍。

新的 Go 项目往往采用了 go modules 管理包依赖,不需要关注项目放置的位置,根据项目根路径的 go.mod 文件去读取加载依赖内容。

由于历史项目的特殊性,比如以及上线运营,评估升级风险过高等原因会要求基于旧的版本持续维护。

对于旧项目、历史项目,如果直接导入到本地 GoLand 之后往往会出现全面飘红或者某些依赖飘红,这时候就要关注一些早期版本的内容了。

Go 在 1.5 版本以前,GOPATH 是一个非常重要的环境变量。

它将标识着代码编译时去寻找实际代码所在的位置,一般从 $GOPATH/src 下寻找代码。

在处理旧项目飘红的整个处理过程往往就是围绕着 GOPATH 来处理的。

处理过程

对于历史项目而言,我们优先考虑将项目放到 GOPATH/src 目录下。

首先查看你的公共 GOPATH 配置,如果没有的话建议创建一个,这个环境变量 GoLand 也能够读取到。

/static/upload/post/1648428007122.png

/static/upload/post/1648428020218.png

历史项目建议直接移到 $GOPATH/src 目录下,src 目录不存在的话可以手工建一个。

为什么要放在 src 下呢?

因为 GOPATH 下存在三个功能目录(约定目录):

  1. src:默认约定编译时查找代码的地方,也是我们项目代码存放的地方。
  2. bin:二进制文件下载目的地,主要存放 go get 安装的内容,以及项目编译后的可执行文件也存放于此。
  3. pkg:编译过程文件(.a 格式)存放路径,如果编译时发现源码没有变动,就不会重新编译 .a 文件。

注意:GOPATH可以配置多个,一般多用于特殊情况下(比如同项目多版本并行开始),正常避免混乱,建议配置一个习惯的目录即可。

如果只是单纯不想放在 /src 下,少年!我劝你耗子尾汁!

但是对于某些特殊的项目,比如其依赖的某个包的版本比较特殊,其他大部分项目用的是别的版本,这时候可以考虑 Project GOPATH。

GoLand 提供了一个 Project GOPATH 配置项,可以理解为项目级的 GOPATH 环境变量配置,仅仅对当前项目生效。

/static/upload/post/1648428035549.png

你可以将具体项目的位置配置进来,该配置也均需约定目录的规则,相当于增加一个独立的 GOPATH 位置。

Project GOPATH 和 直接配置多个系统 GOPATH 还是有很大区别的:

  1. Project GOPATH 仅对当前项目生效。
  2. Project GOPATH 可以理解为系统 GOPATH 的定制化补充,实际编译依旧会尝试去系统 GOPATH 寻找代码。

形象一点来说是一个私有化的 GOPATH,只有自己可以使用和访问。

其他错误

正常来说,只要代码放在 $GOPATH/src 目录下,使得编译器能够寻找到,几乎可以解决所有问题。

这里记录一个有趣的案例。

实际上最终还是没有脱离 $GOPATH/src 的问题。

/static/upload/post/1648428049406.png

导入一个旧工程发现,main.go 中 import 飘红,发现子目录下确实存在一个叫 run 的包,但是就是导入不进来,为什么?

答:依照 import 的 URL 相对于 src 目录调整一下项目的外部目录结构(归根结底还是编译器在 src 下找不到对应的代码所致)。

/static/upload/post/1648428060462.png

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

Golang

Go语言 & 与 * 取值赋值以及函数入参的区别

在 Go 中函数可以接受值传递和指针传递,使用时就涉及到 & 内存地址(指针)与 * 指针赋值的使用,它们的区别是什么?在实际业务使用中,值传递和指针传递的分别应对什么场景需要?针对使用时机进行分析。

GoLand设置gofmt和goimports代码格式化

GoLand 在保存代码时,可以自动调用 gofmt 和 goimports 实现自动格式化代码,在新版本中可以通过 File Watchers 插件来完成这些配置,配置位置位于File

GOPROXY依赖包代理设置

Go1.11版本开始支持包依赖管理工具,新增了GOPROXY环境变量,用于配置依赖包下载代理,通过代理配置可以实现翻墙下载一些所需的依赖包,可以说相当实用

Go数据类型rune介绍和使用

Go 中比较常见的 int、string、bool、float 基本数据类型之外还有其他的数据类型可以应用在特殊场景,比如 rune 就是类似于 int32,因为其可表示的字符范围更大,实际工作中可以用来计算字符串的真实长度

Go报错xx is shadowed during return

调试 Go 程序报错 xx is shadowed during return,方法在返回的时候不是预期的返回结果,错误的产生应当是在相同作用域中出现了同名的变量导致,根据实际业务场景进行修改

Go中接口的设计与实现

Go语言中的接口采用的是隐式实现,不需要去申明实现,只需要直接实现接口所定义的全部方法即可,同时区分了直接实现与指针实现两种形态,在实际使用时需要注意和关注

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核