内网环境下Go module的包管理和包拉取解决方案
前言
很多开发的小伙伴在工作中经常会遇到需要在内网环境下开发生产,因此就必须要解决内网环境下Go语言的包管理和包拉取问题。恰逢我现在公司就需要在内网环境下开发新项目,因此在此记录我们内网环境下Go module的包管理和包拉取解决方案,希望给予其他小伙伴有所借鉴。Go 语言在1.16 版本以后已经默认使用 Go Module 模式进行依赖包管理,而Go Module默认使用https://proxy.golang.org作为代理地址来拉取第三方包,但该地址需要能够访问互联网,另外还需要考虑到很多无法直接访问公共的包管理器,如GitHub、Golang.org、Gopkg.in等。
解决方案
在内网环境下,解决Go module的包管理和包拉取的常规解决方案主要有以下几种:
- 私有代理
在内网中,可以搭建私有的Go module代理服务来缓存、管理和拉取第三方包,以提高包的下载速度,同时解决内网环境下的拉包问题。常用的代理工具有Goproxy、Athens、Nexus等。在搭建好私有代理后,可以设置GOPXOY环境变量来使用私有代理,例如:
$ export GOPROXY = http://172.31.33.33:8080
- Vender目录
可以在项目的根目录下创建vendor目录,将依赖的第三方包直接下载到该目录下。在使用go build、go test等命令时,Go工具链会优先从vendor目录中查找所需的包。在项目根目录下执行以下命令,将当前模块的所有依赖包下载到vendor目录:
$ go mod vendor
需要注意的是,endor目录仅适用于项目内的依赖,如果依赖的包又依赖其他第三方包,则需要手动将这些包下载到vendor目录中。同时,如果vendor目录中存在多个版本的同一个包,则需要手动解决冲突。
- 将依赖包打包到二进制文件中
可以使用go1.16及以上版本的-embed标志,将项目依赖的第三方包打包到二进制文件中,避免在运行时需要依赖外部的包。该方式适用于将应用程序部署到多个环境中,或将应用程序分发给客户端。
$ go build -o app -tags embed -ldflag3="-w -s -extldflags=-static" -embed
以上几个就是在内网中进行Go module包管理和包拉取的解决方案,再结合我们实际开发场景,方案2会导致项目整理越来越大,不利于项目的管理、部署和维护,方案3则是只适合再部署时使用,并不能满足正常的工作开发中的需求场景,因此我们选择方案1,通过内部搭建一个私有的go module代理服务来解决内网环境下的拉包问题。
搭建私有go module代理服务
Go module proxy协议规范发布后,Go社区出现了很多成熟的Goproxy开源实现。从最初的athens,再到国内的两个优秀的开源实现:goproxy和goproxy.io等。最终,在考虑到代理服务的部署及维护的方便程度上,我们选择了使用更为简单的goproxy和goproxy.io来搭建私有go module代理服务。
代理服务搭建
goproxy搭建
- 创建
goproxy文件夹,go mod初始化goproxy:
$ go mod init goproxy
- 创建
goproxy.go文件,监听本地代理端口,初始化goproxy代理:
package main
import (
"net/http"
"github.com/goproxy/goproxy"
)
func main() {
http.ListenAndServe("localhost:8080", &goproxy.Goproxy{})
}
- 修改GOPROXY环境变量,拉取
goproxy服务依赖
$ go env -w GOPROXY=https://goproxy.cn,direct
- 拉取服务依赖,启动
goproxy代理服务:
$ cd goproxy
$ go mod tidy
$ go run goproxy.go
goproxy.io搭建
- git clone拉取
goproxy.io源码:
$ git clone git@github.com:goproxyio/goproxy.git
- 编译
goproxy.io/goproxy下的main.go文件
$ cd goproxy.io/goproxy
$ make
- 命令行启动代理服务
# 直接启动
$ ./bin/goproxy -listen=0.0.0.0:8088 -cacheDir=./modCache -proxy https://goproxy.cn
# 或者已进程方式后台运行时,命令如下:
$ nohup ./bin/goproxy -listen=0.0.0.0:8088 -cacheDir=./modCache -proxy https://goproxy.cn &
代理服务使用及测试
搭建好私有代理服务后,我们就可以开始使用代理服务拉取第三方包了。使用go module代理服务很简单,通常情况下,我们都是使用对应的IDE工具来进行代码开发,直接在对应的IDE工具中为对应项目配置代理服务地址。以研发环境下GoLand为例,配置如下:
- 修改研发机golang环境变量
GOPROXY和GONOSUMDB;
- 修改
GOPROXY环境变量,命令如下:
$ go env -w GOPROXY=http://172.31.31.31:2326,direct
- 修改
GONOSUMDB环境变量,命令如下:
$ go env -w GONOSUMDB=*
默认情况下,当我们执行go get或go mod tidy等命令需要下载模块时,它们会将模块版本和校验和发送到sum.golang.org进行验证,以确保安全性和数据完整性。但由于研发机环境无法连接到环境无法连接到sum.golang.org,因此应该跳过模块的校验和(checksum)验证。
而且,我们拉取的是代理服务器本地的缓存包,本来是已经在代理服务器上通过验证了,因此也可以保证其安全性和完成性。
- 配置GoLand中的
GOPROXY环境变量;
点击Go Module,新增GOPROXY配置项,配置代理服务地址为上述GOPROXY地址。
- 在代理服务器上清空本地go module缓存,使用代理服务器重新拉取 GO 模块
$ go clean -modcache
$ go mod tidy
- 代理服务器拉包完成后,使用研发机拉取代理机上的包缓存即可
$ go mod tidy
针对同一个项目,通过分别配置goproxy和goproxy.io代理服务地址进行测试,最终我们确定goproxy.io会比goproxy更加稳定一些,goproxy经常会以为网络问题出现部分丢包现象,因此我们确定使用goproxy.io来搭建go module私有代理服务。
注意:通过代理服务器拉取go mod,这种方式下,需要保证拉取的go mod依赖包与服务器缓存的依赖包版本一致,否则无法拉取依赖。
参考
内网环境下Go module的包管理和包拉取解决方案的更多相关文章
- 内网环境下为Elasticsearch 5.0.2 添加head服务
背景: 本项目的服务器是内网环境,没有网络,因此需要在离线的环境中,安装head服务. 需要用到的安装包有: node的安装包 elasticsearch的head插件源码 说明:此次只讲述为elas ...
- kali ms17_010 内网环境下渗透笔记
一.先用Router Scan 扫描 看清楚了网络拓扑结构. 二.使用MS17-010批量扫描工具 下载:ms17-010Scan.exe (也可以用kali自带的nmap和ms17-10模块扫) ...
- 虚拟机系统ubuntu12.04(内网环境下的虚拟主机)开启远程连接访问
一.工具准备: 1.内网虚拟机Ubuntu12.04系统主机一台,开放端口为:29999 2.远程连接软件:mobaxterm 二.开启步骤: 1.查看端口状态信息: netstat -antl | ...
- 内网环境下搭建maven私服小技巧
背景 最近接手一个其他公司的项目,因为工程中使用了maven,而且里面有很多他们自己封装很多自己的构件(就是jar.war等等),需要将他们maven私服迁移到我们的私服上去,因为网络环境不通,所以不 ...
- windows环境下本地项目(或gitlab上拉取项目)在Jenkins上自动打包部署 超超超详细!!!!!
一.环境准备 1.下载jdk,官网:http://www.oracle.com/ 2.下载Jenkins,官网:https://www.jenkins.io/ 3.下载Tomcat,官网:http:/ ...
- Linux系统如何在离线环境或内网环境安装部署Docker服务和其他服务
如何在离线环境或纯内网环境的Linux机器上安装部署Docker服务或其他服务.本次我们以Docker服务和Ansible服务为例. 获取指定服务的所有rpm包 保证要获取rpm包的机器能够上网. 本 ...
- 内网环境上部署k8s+docker集群:集群ftp的yum源配置
接触docker已经有一年了,想把做的时候的一些知识分享给大家. 因为公司机房是内网环境无法连接外网,所以这里所有的部署都是基于内网环境进行的. 首先,需要通过ftp服务制作本地的yum源,可以从ht ...
- Centos7.2内网环境安装MySQL5.7.24
1.配置本地yum源 内网环境,首先需要配置本地yum源,以解决MySQL的依赖安装,具体参考该文:点击打开 2.查看服务器环境 uname -a 3.去官网下载MySQL安装包 MySQL官网网址: ...
- 内网环境搭建NTP服务器
说在前面:ntp和ntpdate区别 ①两个服务都是centos自带的(centos7中不自带ntp).ntp的安装包名是ntp:ntpdate的安装包是ntpdate.他们并非由一个安装包提供. ② ...
- 内网Linux下安装Nginx1.23,添加stream模块实现tcp/udp代理转发
环境:centos7.6 ngx_stream_core_module 这个模块在1.9.0版本后将被启用.但是并不会默认安装,需要在编译时通过指定 --with-stream 参数来激活这个模块,w ...
随机推荐
- 【Python】基础操作
指定解释器的运行环境 有时候我们会遇见报错 SyntaxError: Non-ASCII character '\xe4' in file E:/PycharmProjects/LEDdisplay2 ...
- 【JVM之内存与垃圾回收篇】直接内存
直接内存 Direct Memory 不是虚拟机运行时数据区的一部分,也不是<Java 虚拟机规范>中定义的内存区域. 直接内存是在 Java 堆外的.直接向系统申请的内存区间. 来源于 ...
- IP地址查询服务
IP地址查询站点 https://ip.cn/ http://ip.qq.com/ http://ip138.com/ https://www.apnic.net/ ... IP计算 ip地址在线计算 ...
- 使用克魔助手查看iOS 应用程序使用历史记录和耗能历史记录
使用克魔助手查看iOS 应用程序使用历史记录和耗能历史记录 功能概述 克魔助手无需越狱即可访问iOS上各个应用程序的历史记录,包括: 最近几个月的app的详细启动时间记录,结束时间,app使用的硬件组 ...
- Wolfram常用计算
1.方程与方程组 例1:求解方程 参考表达式: solve x^3 + 2x^2 - 6x + 5 = 0 real 求解所有根 例2:求解方程: 参考表达式: solve ax^2+bx+c=0 注 ...
- Semaphore.acquire()方法的底层原理
一.acquire() 的工作流程 当调用 acquire() 方法时,实际调用的是 AQS 的 acquireSharedInterruptibly(1) 方法.以下是其详细工作流程: // acq ...
- 让 AI 对接和 MySQL 数据库对话
一.场景说明: 通过 AI 连接 MySQL 结构化数据库表,预期实现通过AI对话数据库表,快速了解数据情况,能够进行简单的汇总统计,快是实现问答. 二.资源准备: 需提前准备以下内容: AI大语言模 ...
- CSP-S 17天冲刺计划
var code = "91461527-5e0b-458f-ae4b-db46cf2a11c8" D1~D3(树专题复习)(OK\color{green}OKOK) 树基础(OK ...
- 操作系统综合题之“用记录型信号量机制的wait和signal操作来解决了由北向南和由南向北过河人的同步问题(独木桥问题-代码补充)”
1.问题:一条哦东西走向河流上,有一根南北走向的独木桥,要想过河只能通过这根独木桥.只要人们朝着相同的方向过独木桥,同一时刻允许有多个人可以通过.如果在相反的方向上同时有两个人过独木桥则会发生死锁.如 ...
- java基础之“深复制和浅复制的区别”
一.浅复制 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都任然指向原来的对象. 二.深复制 深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用对象 三.举例 产品 ...