关于Go语言的依赖管理疑惑| 青训营笔记

97 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

hello everybody 我是Devin,今天是我写笔记的第二天,昨天的笔记我们简单的对GO语言的语法做了简短的了解,今天我们来深入一些,思考一些关于比如依赖管理、一些我遇到的奇怪小bug


依赖管理-为啥import的都是仓库地址?

这个可以说是我对go最疑惑的地方了,因为在.go语言import那里我们都是填github的地址,难道我每次运行go语言文件都要联网去连接那些文件吗?像其他语言我们都是把依赖下载到本地的仓库里,当要使用的时候直接导入进来本地的包就行了,甚至有时候源文件就在本地,我们import自己项目下的文件都填了代码仓库地址,这真的很奇怪 我们来看个例子

import (
   "net"

   "github.com/cloudwego/kitex-examples/bizdemo/easy_note/cmd/note/dal"
   "github.com/cloudwego/kitex-examples/bizdemo/easy_note/cmd/note/rpc"
   note "github.com/cloudwego/kitex-examples/bizdemo/easy_note/kitex_gen/notedemo/noteservice"
   "github.com/cloudwego/kitex-examples/bizdemo/easy_note/pkg/bound"
   "github.com/cloudwego/kitex-examples/bizdemo/easy_note/pkg/constants"
   "github.com/cloudwego/kitex-examples/bizdemo/easy_note/pkg/middleware"
   tracer2 "github.com/cloudwego/kitex-examples/bizdemo/easy_note/pkg/tracer"
   "github.com/cloudwego/kitex/pkg/klog"
   "github.com/cloudwego/kitex/pkg/limit"
   "github.com/cloudwego/kitex/pkg/rpcinfo"
   "github.com/cloudwego/kitex/server"
   etcd "github.com/kitex-contrib/registry-etcd"
   trace "github.com/kitex-contrib/tracer-opentracing"
)

func Init() {
   tracer2.InitJaeger(constants.NoteServiceName)
   rpc.InitRPC()
   dal.Init()
}

这个项目是kitex-examples里面的一个小demo,名字是eazy_note,大家看到没,这个文件导入自己目录pkg下的文件都填的是github/xxxxx的地址,这是不是很诡异的一件事,我本地有的文件不在本地读,跑到线上去读,如果某天家里网断了,是不是都运行不了这些go项目了?

其实不是的 原来如此

关键就在于go.mod文件,我们来看看它

module github.com/cloudwego/kitex-examples/bizdemo/easy_note

go 1.16

require (
   github.com/apache/thrift v0.15.0
   github.com/bytedance/gopkg v0.0.0-20221122125632-68358b8ecec6 // indirect
   github.com/cloudwego/hertz v0.4.0
   github.com/cloudwego/kitex v0.4.4
   github.com/cloudwego/netpoll v0.3.2 // indirect
   github.com/hertz-contrib/jwt v1.0.1
   github.com/kitex-contrib/registry-etcd v0.0.0-20220110034026-b1c94979cea3
   github.com/kitex-contrib/tracer-opentracing v0.0.3
   github.com/opentracing/opentracing-go v1.2.0
   github.com/shirou/gopsutil v3.21.11+incompatible
   github.com/tklauser/go-sysconf v0.3.9 // indirect
   github.com/uber/jaeger-client-go v2.30.0+incompatible
   github.com/yusufpapurcu/wmi v1.2.2 // indirect
   golang.org/x/net v0.5.0 // indirect
   google.golang.org/protobuf v1.28.1
   gorm.io/driver/mysql v1.2.3
   gorm.io/gorm v1.22.5
   gorm.io/plugin/opentracing v0.0.0-20211220013347-7d2b2af23560
)

replace github.com/apache/thrift => github.com/apache/thrift v0.13.0

首先第一行,是我们的module,项目名称,这个是我们自定义的,关键为什么导入的本地依赖是网址问题就出在这里,虽然我们import的是github/xxx但是实际上是从go.mod所在的文件目录开始的,也就是说虽然import的是url,但是实际是在本地读取的,想到这,其实require那些依赖都有了头绪了,只有在go mod download或者go mod tidy的时候是真正在从网络上下载依赖,其他时候我们import的都是本地的东西,只是因为它们go.mod文件下的module名字就是仓库地址才导致import的地址十分奇怪

以上就是本篇笔记的全部内容啦