踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)

前言:记录一个go新手第一次构建复杂开源库的经历。go虽然是新手,但是编程上还是有多年的经验,除了c/c++,用过IDEA能进行简单的java编程、甚至scala编程。所以最开始还是有点信心的。所以也有点急于求成。而整个过程比我想象的复杂。

 

一、准备

今天已经927周一了,昨天补国庆的班。

从上上周918周五开始就熟悉go语言最简单的hello程序。中间有个中秋。922周二下载开源库,有关loraserver的,有三个模块如下图:

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 最后几个数字表示当前生产环境上运行的版本号。当时先在windows上编译,发现有些字段的定义已经没法找到源库了,如下图:

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

再下载了最新的版本如下图:

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 可以看出, 最新版本号和当前版本号之间的跨度还是有点大的。当前版本号好像是2019年(当时的情况已经没法求证,我也是第一次介入这个产品),相差约两年。然后可以对比一下代码变化也是挺大的。如下图:

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

可以看出go版本和一些库都在变化。代码比较改动量很大,用对比工具可以看出来,一片中国红。

 《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 所以,我就直接试着编译windows的版本,果然,最新版本还是比较顺利。所以我想一定要升级了,否则老版本虽然有代码,但是即使改了也没法编译!

然后开始尝试编译linux的版本,竟然也很顺利,因为vscode能支持go的跨平台编译。我当时还窃喜,认为go语言也许就这样!go确实好用!

时间到了9-23,保持了当前环境的数据库表格和数据。就试着开始在linux上运行,现在才知道,恶梦开始了。 

二、问题

问题1、自己编译的库刷不出界面,而下载的库能!

当然,这只是其中提供界面的那个库(三个之一)。库的功能是没问题的,因为我用下载的库,发现了之前的数据是在的。

同时,后面所有问题都是围绕解决这个问题而来的。也可以说,后面的问题是对这个问题的分解。

问题2、go与web,npm与node都是些啥,有啥关系?而npm install老是失败!

1、编译与go embed

在前面编译的时候,有界面的库在下面这个文件有错误的。后面查”//go:embed “是go的一个新特性,是一个配置项。所以当时我删除了很多后面的配置项才能通过。

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 

 其实这个才是问题。我们搜索一下:

embed是什么

embed是在Go 1.16中新加包。它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力。

所以,试图看官网怎么编译

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

然后结合makefile文件。前面两项就是编译UI。

2、npm install

再回到第一个问题我们看到,同样是web界面刷不出来。go实现了web service!然后这两天买了两本go语言的书,也看到了一些go web的书,看来go开发web是不错。而c/c++个人认为短板恰恰是网络编程这块。但这些只是概念,当看到工程文件Makefile中UI用到了npm(工具),一脸懵懂!哦,是nodejs啥相关的,可是nodejs也就是知道概念。就跟知道go一样,只知道都是编程语言。好吧,硬着头皮上,网上找方法呗,下载了一个最新版本的nodejs,node和npm都装好了。这下可以编译web的功能了吧。

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 然后npm intall出现“run `npm audit fix` to fix them, or `npm audit` for details”等错误,网上找方法,提示

npm audit fix

npm audit fix –force

npm intall

按这三个步骤还是失败。最后求助公司web端负责人,说版本太高了,降低一下版本试试,然后他电脑上安装的版本是这个: 

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 我按这个版本重新安装,再次npm intall,竟然成功了。

3、Linux下npm intall

在Linux安装npm intall时,还是出现了问题

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 最后显示如下错误

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

现在网上找了一番。

方案一:

Step1:
npm cache clean --force

Step2:
rm -rf node_modules

Step3:
rm -rf package-lock.json

Step4:
npm install 验证不行。   方案二、

说一下最后的解决办法
1、首先降低npm版本
npm install npm@4.6.1 -g
2、使用淘宝镜像
npm config set registry https://registry.npm.taobao.org
3、验证一下是否成功
npm config get registry
4、清楚一下安装缓存
npm cache clean –force
5、安装cnpm
npm install -g cnpm –registry=https://registry.npm.taobao.org
6、cnpm -v查看是否安装成功

我执行了234,还是不行。

然后再次请教web端负责人,说可以安装cnpm,后面的命令都改为cnpm。如果可行!

最后,怀着一种好奇心,查了查cnpm和npm之间到底啥关系。可以参考《主流包管理工具npm、yarn、cnpm、pnpm之间的区别与联系——原理篇》。似乎,npm发展到cnpm、再到yarn、最后到pnpm。但是这几者都有不少人在使用。对于我们这些新手而言,出问题了就换一个吧。 

问题3、linux下依赖包下载失败

前面提到,go似乎能支持跨平台编译,所以我开始总是想着在windows上寻求编译的解决方案。装mingw、装gcc、装make工具。但是还需要安装linux的go语言工具,git工具等等。所以直接到Linux环境下进行构建。前面提到的编译UI在windows下也没问题,但是Linux下有问题的。同样的编译主程序也是。

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 

 提示X509证书找不到错误。但是windows为啥OK的,我后来想起windows下装了github,难道是这样原因?我还真找了信息安全组的同事,希望给一个windows下类似的证书。同时继续在网上找方案,和同事沟通。同事说要f.q.,因这些都是国外的网站。然后我想起了,java都是有阿里云的镜像,go没有吗?有同事给了一个代码的地址,hubfast。代替github.com这个域名可以,但是代替golang.org就不行。其实现在想想或许可以replace。

但问题的关键是,如何修改?因为这些依赖包都是放在go.mod文件种,如下图:

《踩坑经验总结之go web开源库第一次编译构建,GO111MODULE的设置(及GOPROXY)》

 

可是这个文件是什么,当时有同事跟我说用go mod download试试,我第一次知道这个命令!那么这个文件和go mod又有啥关系?

1、go mod是什么?GOPATH配置项到底要不要配?go vendor 模式又是什么鬼?这三者可有联系?

文章《golang中使用GOPATH模式和GoModule(gomod)模式的区别》对这三个概念和原理讲得比较清楚。如果总结一句话,三者都是包管理模式,依次从go path演进到go vendor、再演进到go mod。那么我们要关注的就是go mod,其他两项基本要淘汰了。与上述的npm工具不一样。从功能看,npm侧重包管理,而这三者侧重依赖包管理。npm侧重Web UI包,而这三种主要面向go语言。

前面苦苦纳闷在Linux下配置GOPATH提示不能和GOROOT相同,而windows却又可以。其实不必在意。

所以看了这篇文章后,对go.mod的文件构成和go mod一系列命令就恍然大悟了。和java的maven很相似。 同时也说明go语言发展非常迅速!

2、依赖包如何配置代理?!

从前面可以得知,go mod是可以管理依赖包的,但是这网站都是国外的。需要配置代理。

windows下vscode搭建go的开发环境时,配置过go env。但是Linux上没有改动过。所以当我再次想配置set GO111MODULE=on总是失败,所以在网上再次搜索一番。

找到《GO111MODULE的设置(及GOPROXY)》,原来要用 go env -w修改。然后的然后看到标题了没有,这不还有proxy吗?这不是第一次搭建windows vscode go环境就用到了的吗?

go env -w GOPROXY=https://goproxy.io,direct
go env -w GO111MODULE=on

而且文章也提到了“可以用go env -u 恢复初始设置;GOPROXY的值应该还可以是https://mirrors.aliyun.com/goproxy/  或 https://goproxy.cn”。

原来早就打过招呼的。原来windows能下载这些库并不是因为证书的原因。

我们也再次回到GO111MODULE的真正含义:

GO111MODULE=off禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
GO111MODULE=on启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,自动开启模块支持。

到这里,Linux下的编译终于成功了! 

问题3、linux下其他问题 

上述linux编译完成后,运行正常。但是以上问题解决比较零散,makefile文件基本上全是单步执行。那么整体运行会不会真的可以了呢。还是出现了两个小问题。

其中之一如下:

git clone 遇到问题:fatal: unable to access ‘https://github.comxxxxxxxxxxx’: Failed to connect to xxxxxxxxxxxxx

解决方法:将命令行里的http改为git重新执行。

还有其中之一就是cnpm的问题了,前面已经提到。

三、总结

现在再回过头看,这些问题也不复杂。所以还是没有经验。做技术就是如此,经历过觉得没什么,但是在这个过程中还是比较忐忑的。人生也是如此,第一次经历总是苦涩的、难忘的。也许正是这样,才是成长。现在再看起来,和go之间似乎多了一份亲切感!最后,希望下一次面对一种全新的语种会更加从容。

 

点赞