当前位置: 首页 > 科技观察

一个模块化的

时间:2023-03-13 13:26:44 科技观察

前言,带你进入Go语言。很久以前,我逼着自己学习go语言,但是看了基础语法就放弃了。我的工作中确实没有应用场景。最近发现突然冒出了基于go的esbuild。我想深入研究它的奥秘,但我无法理解。所以,我打算先从go开始学,学好go后再去学esbuild。所以上几篇文章会写一些go的学习心得,而今天的文章就从go语言的模块化说起。环境变量学习go语言的第一步当然是安装和环境变量。由于我是macos,直接运行brewinstallgo就可以安装成功,也可以到官网(https://golang.google.cn/)下载对应的二进制包。安装成功后,需要配置以下环境变量:GOROOT:go语言的安装路径;GOBIN:go语言的可执行文件路径,一般为“$GOROOT/bin”;GOPATH:工作目录,可以设置多个,每个项目可以单独设置一个GOPATH;GoLand中的GOPATH(go语言最强IDE),我们可以在Preferences中设置多个GOPATH,并将GOPATH分为全局和局部。GOPATH最早的意思是管理模块。每个GOPATH中都会有三个目录:src:用于存放源代码;pkg:用于存放编译后的.a(archive)静态库文件;bin:用于存放编译后可以直接运行的二进制文件;一般设置为工作目录的src文件夹需要手动创建,另外两个目录是编译后自动生成的。接下来,我们新建一个目录~/Code/goland/go-story,并将该目录设置为工作目录。exportGOPATH="~/Code/goland/go-story"然后在当前目录新建src文件夹,新建hello目录,在hello目录新建main.go文件。在hello/main.go文件中,写入如下代码:{flag.Parse()//解析命令行参数fmt.Printf("\nHello%s\n",name)}flag库是go的内置模块,类似于node的commander库,运行后结果为如下:接下来介绍一个可以让命令行输出更加丰富多彩的库:colourize,类似于node.js中的chalk。使用如下命令安装依赖:gogetgithub.com/TreyBastian/colourize运行后我们可以看到在工作区自动创建了一个pkg目录,并在该目录下创建了新生成的colourize库文件,并新建了一个github在src目录下也创建了.com目录,用来放colourize的源代码。goget命令可以简单理解为npminstall。然后就可以在hello/main.go中引入依赖了。packagemainimport("flag""fmt""github.com/TreyBastian/colourize")varnamestringfuncinit(){flag.StringVar(&name,"name","everyone","Thegreetingobject.")}funchello(namestring){fmt.printf(colourize.Colourize("\nHello%s\n",colourize.Blue),name)}funcmain(){flag.Parse()hello(name)}运行hello/main.go可以看到命令行输出蓝色文本。godependencies的加载机制默认是:$GOROOT下的src目录src目录下的$GOPATHGoVendor前面的方法有一个很麻烦的问题,就是没办法做好版本管理,多个Dependencies分散在$GOPATH/src目录下,可能会出现很多麻烦的问题。比如我现在GOPATH下有两个项目:go-blog和go-stroy。这两个项目依赖关系不同,分散在github.com目录下。这个时候是不是应该把整个github.com目录都加到版本库里呢?在1.5版本中,go引入了vendor机制。在每个项目目录下,依赖可以存放在vendor目录下,类似于node.js中的node_modules目录。使用govendor需要先安装govendor模块。gogetgovendor然后在项目目录下运行如下命令。cd~/Code/gland/go-story/src/hellogovendorinitgovendoraddgithub.com/TreyBastian/colourize可以看到在hello项目下新生成了一个vendor目录,colourize也复制到了这个目录下。而govendor会创建一个新的vendor.json文件用于依赖管理。使用govendor,加载依赖的顺序如下:项目目录下的vendor目录项目目录上面的vendor目录不断冒泡...(PS。类似node_modules)$GOPATH下的vendor目录项目目录下的vendor目录$GOROOTsrc目录下$GOPATH下的src目录配置开关有一点需要注意。在go1.5版本中,govendor默认是不开启的,需要手动配置环境变量:exportGO15VENDOREXPERIMENT=1在go1.6版本中,govendor已经改为默认开启。GoModules1.5版本虽然推出了govendor,但并没有解决根本问题。只是在依赖搜索中支持了vendor目录,vendor目录还需要一些第三方库(govendor、godep、glide)来管理,对于GOPATH环境变量还是有依赖的。为了解决这些问题,官方终于在1.11版本实验性的内置了其模块管理能力(1.12版本正式开放):gomod。在使用gomod时,我们不需要GOPATH,所以需要清理之前配置的GOPATH,调整目录结构,将go-story/hello/main.go直接移动到go-story/main.go,然后src,删除pkg目录。#Initializegomodulesgomodinit[pkg-name]此时会在目录下生成一个go.mod文件。查看其内容,发现其中会声明go的版本号和当前模块的名称。然后我们安装依赖(无论依赖管理方式如何,安装方式都是一样的):gogetgithub.com/TreyBastian/colourizego.mod,添加的依赖和版本号都会写上,同时安装模块进入GOPATH的时间。由于我们之前删除了GOPATH,这将安装到默认的GOPATH(~/go/)。综上所述,之前在开发node的过程中,踩了很多npm的坑,社区对npm的吐槽也很多,还有很多第三方模块:yarn,pnpm等等。没想到go的模块管理也是一部血泪史。现在下载一些老的go项目,找一些govendormanagement的项目。另外,在gomod出现后,go官方也在计划移除GOPATH。