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

一、准备

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

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

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

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

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

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

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

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

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

二、问题

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

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

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

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

1、编译与go embed

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

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

embed是什么

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

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

然后结合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的功能了吧。

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

npm audit fix

npm audit fix --force

npm intall

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

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

3、Linux下npm intall

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

最后显示如下错误

现在网上找了一番。

方案一:

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下有问题的。同样的编译主程序也是。

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

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

可是这个文件是什么,当时有同事跟我说用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之间似乎多了一份亲切感!最后,希望下一次面对一种全新的语种会更加从容。

踩坑经验总结之go web开源库第一次编译构建的更多相关文章

  1. 开源库SRT编译指南

    SRT(Secure,Reliable,Transport)是Haivision公司开发的一套开源媒体传输协议,用于在不稳定的网络环境下,优化媒体数据的传输性能.  SRT的码流加密基于开源库open ...

  2. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~

    这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...

  3. 程序员的踩坑经验总结(一):如何把Bug的偶现变必现

    程序员的踩过的坑也是可以分类的,很常见又很难解决的一类是偶然的现象,表现起来比较怪异. 而把一个问题Bug的偶现变成必现,是开发人员的一种能力.我认为也应该是测试人员的一种能力,但是各个公司要求不一样 ...

  4. 攻城记:Thinkphp框架的项目规划总结和踩坑经验

    一.项目模块规划 1.项目分为PC端.移动端.和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin: 对应入口 ...

  5. 微信jssdk批量添加卡券接口(踩坑经验)

    1)首先是官方接口文档: 1.批量添加卡券接口:https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.0861973 ...

  6. SpringCloud整合过程中jar依赖踩坑经验

    今天在搭建SpringCloud Eureka过程中,一直在报pom依赖错误,排查问题总结如下经验. 1.SpringBoot整合SpringCloud两者版本是有严格约束的,详细见SpringBoo ...

  7. TensorFlow保存、加载模型参数 | 原理描述及踩坑经验总结

    写在前面 我之前使用的LSTM计算单元是根据其前向传播的计算公式手动实现的,这两天想要和TensorFlow自带的tf.nn.rnn_cell.BasicLSTMCell()比较一下,看看哪个训练速度 ...

  8. Nodejs 8.0 踩坑经验汇总

    .Linq:Linq to sql 类 高度集成化的数据库访问技术 使用Linq是应该注意的问题: 1.创建Linq连接后生成的dbml文件不要变动,生成的表不要碰,拖动表也会造成数据库连接发生变动, ...

  9. 【转】Thinkphp框架的项目规划总结和踩坑经验

    http://www.360doc.com/content/16/1206/22/466494_612576533.shtml

随机推荐

  1. mfc 常用的知识点

    在MFC中引入了文档-视结构的概念,文档相当于数据容器,视相当于查看数据的窗口或是和数据发生交互的窗口.因此一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDoc ...

  2. 【spring 注解驱动开发】spring自动装配

    尚学堂spring 注解驱动开发学习笔记之 - 自动装配 自动装配 1.自动装配-@Autowired&@Qualifier&@Primary 2.自动装配-@Resource& ...

  3. c# – RichTextBox用表情符号/图像替换字符串

    在RichtTextBox中,我想用表情符号图像自动替换表情符号字符串(例如:D).我到目前为止工作,除了当我在现有的单词/字符串之间写出表情符号字符串时,图像会在行尾插入. 例如:你好(在这里插入: ...

  4. 【springcloud】springcloud Greenwich SR4版本笔记

    springcloud Greenwich SR4版本笔记 本文只记录实际版本,配置,pom,代码以及注意事项.别的在其他springcloud 的F版本中已有详述. 示例代码地址:https://g ...

  5. mzy git学习,撤销修改(二)

    git checkout – file: 撤销我们对工作区的修改(没有提交到暂存区) 当我们在工作区修改了之后,并没有提交到暂存区,如果要撤销对 某个文件的修改的话,就使用 git checkout ...

  6. GUI编程路线

    基本路线

  7. for循环练习之打印三角形

    public class TestDemo01 { /** * 打印三角形 * 1.打印空格 * 2.打印三角形 */ public static void main(String[] args) { ...

  8. 性能测试工具JMeter 基础(四)—— 录制脚本

    对于JMeter中HTTP请求除了手动添加以为还可以进行脚本录制,有两个方法: 使用badboy录制,录制完成后,将录制的文件导入JMeter中 使用JMeter自带的录制原件进行录制(HTTP(S) ...

  9. 20210816 你相信引力吗,marshland,party?,半夜

    考场 第一眼都不可做 T1 长得就像单调栈/单调队列,推了推性质发现优弧.劣弧都合法的点对很好处理,其他情况只在一种情况合法,那么开两个单调队列分别统计距离 \(\le\frac2n,>\fra ...

  10. Mysql常用sql语句(6)- limit 限制查询结果的条数

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 实际工作中,我们的数据表数据肯定都是万级别的,如 ...