未能加载包studio package_前端工程师吐后端工程师(第五讲)——包管理工具Nodejs npm和Go mod...

625f3011a964801e3acad11affe4216a.png

在我们做前端的时候,很少会有人做需求的时候上去就什么脚手架都不用直接裸写,基本都会找个所谓的框架,比如三大框架:Angular、Vue、React。写Nodejs的时候,可能会使用Express、Egg、Koa所以在做Go的时候我们也不会裸写,需要选个Go的框架。

对比了一下,现在盛行的Go框架,选择了Gin。Gin是一个golang的微框架,API比较友好,源码注释文档非常优秀,具有快速灵活,容错方便等特点。其实对于go而言,web框架的依赖要远比Python,Java、PHP要小。自身的net/http足够简单,性能也非常不错。支持命名路径参数和通配符、支持路由分组、支持数据渲染器。

在使用之前我需要先把Gin框架下载下来,这就涉及到一门语言的另一个重要功能——包管理工具。我们可以把他理解为前端Nodejs的npm,与Nodejs不同的是,Nodejs在刚刚诞生的时候就有npm,但是在Go刚刚出现的时候,想要对go语言包进行管理,只能依赖第三方库实现,比如Vendor,GoVendor,GoDep,Dep,Glide等等,对于初学者来说,真的是选择困难症。

好在golang 1.11之后,Go提供了官方包管理工具mod。首要GO111MODULE为默认开启状态,在终端中执行下面两条指令。

export GO11MODULE=on
export GO111MODULE=on

因为大多数情况下,Go的依赖包因为有些原因下载不下来,我们还需要设置代理来加速包的下载,指令如下:

export GOPROXY=https://goproxy.io

至此我们可以理解为跟项目无关的包设置就完成了。相当于Nodejs中npm。设置了一个npm--registry,但是却别在于npm--registry设置的是一个包的下载源头,而GOPROXY设置的是去找源头的通道。

介绍Go语言包管理还要引入一个Go中的概念,叫做GOPATH,可以理解为Nodejs依赖包的安装目录,只不过我们在安装Nodejs依赖的时候(也就是执行npm install的时候)。包会被下载到名字叫做node_modules的文件夹中,在Nodejs项目中引用的第三方模块都会现在到这个文件里,上线的时候也会把这部分第三方依赖推送上线,如下图所示。

ad37be15fad3b1e63b6f7bde7349b11c.png

GOPATH 实际上也是做这部分工作,就是Go语言本身需要引入的第三方类库都存在这个文件夹下,我们执行go env查看Go当面环境的时候,是可以看到下图中GOPATH所处位置/User/chenchen/go(我设置的),可以理解为Nodejs中的node_modules目录其实就是,Go中我设置的GOPATH也就是/User/chenchen/go目录,如下图所示。

ffeaf1cd2aaee6b3e9e932fc80a3b529.png

我们在工作目录下执行go mod init gin_test用mod初始化一个Go项目。可以看到刚刚执行的命令创建了一个叫做gin_test的文件夹,进去gin_test文件夹之后发现有一个叫做go.mod的文件,go.mod就相当于nodejs的package.json。打开文件只有两行代码。一行标识,一行是Go的版本号。这两行代码可以理解为npm的package中的包名称 和 版本号。

9f4fc95841747f3e9963789b353383e6.png

4ea46f2a880ab8c68f72c9dcdb04d356.png

然后我们创建一个main.go的文件,里面输入第四讲的HelloWorld代码,然后执行go build,会发现多出了一个叫做gin_test的二进制可执行文件。

2861efca9008658a6c5189f776477fda.png

当然直接运行他就会打印出下图中展示的HelloWorld,这是另一种Go的执行方式,先编译再执行。如果说第四讲中的go run 相当于 Nodejs 中的npm run 的话。那么Go build就相当于常规Nodejs的npm build指令了。

310dd759daffd21112d7fe1ec6ffd4ee.png

如果要在Go项目中引入Gin需要打开go.mod文件,并且加入一行Gin依赖代码。因为之前我们在本讲最开始的时候我们说技术选型选择了Go的Gin框架,所以我们这里就在这里输入require http://github.com/gin-gonic/gin v1.5.0,用来加载Gin的依赖,如下图所示。

64c771e175a675a88f76540563306d9a.png

这时我们再执行一下go build就会发现多出了一个叫做go.sum的文件,如下图。

b9e42ff129cab1e5b6c33e1244084fa8.png

打开这个文件之后就会看到对应依赖库的下载地址。

26c2d732e40bfaea57bd14ac3fc74278.png

其实在执行go build之后,此时此刻这些依赖库已经下载到本地中了,并且存储在本讲最开始的GOPATH路径下。我们进入自己设置的GOPATH也就是/User/chenchen/go文件夹,就可以看到一个叫做pkg的文件夹。进入pkg下的mod/cache/download/http://github.com中就能找到go.sum文件中描述的依赖文件了,比如go.sum文件中第三行的go-contrib包,就可以在红框文件夹中发现。

4c73f9d7cf93c4aaff93402bcb97118a.png

至此,本讲已经介绍了包依赖的引入、下载、配置,还介绍了go中的另一种执行方式。第六讲中我们将详细介绍,如何使用在代码中引入Gin搭建一个简单的WebServer。

在最后补充一点,提问中有人问Go的全局提供包和自定义包冲突时候是否跟Nodejs一样。因为Go的全局模块应用均不带路径,带路径的均是自定义包。如果出现在项目跟路径下引入一个fmt.go的包,并且在main.go中引入fmt.go的话,在项目build阶段就会报错。结果如下:

0d360150a3b0a05b854b60a3a3bd7556.png

陈辰(CC老师) 978563552@qq.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值