内网环境下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 ...
随机推荐
- H5 ios端底部安全距离CSS
html 头部添加 <meta name="viewport" content="width=device-width, initial-scale=1.0,min ...
- 一文详解银河麒麟配置容器运行时及gVisor(runsc)、Kata(runv)详细指南
容器运行时介绍 容器运行时核心概念与分类 容器运行时(Container Runtime)是管理容器生命周期(创建.启动.停止.删除)和资源隔离的核心组件,通过与操作系统内核协作实现容器化环境.根据功 ...
- 小模型工具调用能力激活:以Qwen2.5 0.5B为例的Prompt工程实践
在之前的分析中,我们深入探讨了cline prompt的设计理念(Cline技术分析:prompt如何驱动大模型对本地文件实现自主变更),揭示了其在激发语言模型能力方面的潜力.现在,我们将这些理论付诸 ...
- 腾讯出品!这款Markdown神器让你码字效率翻倍,双模式编辑太香了!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 由腾讯开源的CherryMarkdown编辑器,集思维导图式大纲写作与专业分屏模式于一身,支 ...
- net core mvc6使用jwt实现简单的登录
创建一个新的.NET Core Web应用程序项目.在创建项目时,选择MVC模板. 在项目中添加Microsoft.AspNetCore.Authentication.JwtBearer包: 在Vis ...
- Pandas中两个DataFrame的差集
在pandas中,两个DataFrame的差集并没有直接的库内置方法,现在我们希望有一种方法,就像python中set内置的求差集一样,来找到两个DataFrame的差集. >>> ...
- 为什么使用MQ
在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 开发中消息队列通常有如下应用场景: 1.任务异步处理 ...
- Spring注解之@Async:Spring Boot实现异步调用
前言 在日常开发过程中,会遇到一些需求是和主业务逻辑低耦合的,不要求和主业务逻辑同步进行,比如记录日志信息.发送消息通知电子邮件.生成PDF合同和导出报表等需求,而且,这些需求往往处理起来比较耗时.这 ...
- java客户端发送socket消息到指定服务并接收响应
做个笔记 /** * 发送socket到指定服务 * 接收有6位报文头长度的响应,支持读取分包 * * @param host IP * @param port 端口 * @param msg 消息内 ...
- ElasticSearch高可用部署
简单说明 我们在部署ElasticSearch高可用集群时,要规划好集群的规模,每个节点的职责,规划好后续的水平扩展方案,再进行部署. 核心概念 Cluster:集群,由一个或多个 Elasticse ...