• 踩坑经验总结之go web开源库第一次编译构建


    前言:记录一个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之间似乎多了一份亲切感!最后,希望下一次面对一种全新的语种会更加从容。

  • 相关阅读:
    【2021-01-07】叫我“何工”就好
    2021年的 目标计划
    转:我在拼多多的三年 https://www.leadroyal.cn/?p=1228#more-1228
    匀强电场等效重力场
    开源图片素材管理软件-civet
    心学#传习录学习
    工作感受月记202101月
    统计字典序元音字符的数量
    可被5整除的二进制
    假期刷题--JAVA
  • 原文地址:https://www.cnblogs.com/orange-CC/p/15343808.html
Copyright © 2020-2023  润新知