
目前go mod已成为go开发的标准模式,国内也有一些优秀的代理,例如 https://goproxy.io,https://goproxy.cn等,但是企业内部gitlab上的源码如何引用拉取呢?今天给大家两种解决方案:
x01
一、增加环境变量,go版本要求1.13+
export GOPRIVATE="git.yourdomain.com"
声明指定的域名为私有仓库,go get在处理该域名下的所有依赖时,会直接跳过GOPROXY和CHECKSUM等逻辑。另外它默认前缀匹配,所有有人domain.com/xxx前缀的依赖模块都会被视为private-modules,它对于企业、私有Group等有着一劳永逸的益处。
x02 使用athens 与nginx
一、组件依赖:
athens:https://github.com/gomods/athens
nginx
二、安装athens
1、源码安装方式
git clone https://github.com/gomods/athenscd athensmake build-ver VERSION="0.11.0"./athens -version
输出如下信息说明编译成功:
Build Details:
Version: 0.11.0
Date: 2021-09-28-07:05:35-UTC
运行文件:
./athens -config_file=config.dev.toml
config.dev.toml部分配置文件修改如下:
GoGetDir = "/data/athens/storage" # go get时的目录, 根据情况指定StorageType = "disk"[Storage][Storage.Disk]RootPath = "/data/athens/storage"
2、 docker安装方式:
export ATHENS_STORAGE=/data/athens/storagemkdir -p $ATHENS_STORAGEdocker run -d -v $ATHENS_STORAGE:/var/lib/athens \-e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens \-e ATHENS_STORAGE_TYPE=disk \--name athens-proxy \--restart always \-p 3000:3000 \gomods/athens:latest
三、增加nginx配置:
upstream go-private {server 127.0.0.1:3000;}server {listen 6666;location / {proxy_pass https://goproxy.cn; # 外网的统一走镜像代理服务proxy_cache_valid 30d;}location ~ /(gitlab\.yourdomain\.com)/ {proxy_pass http://go-private; # 企业内部走私有仓库}}
通过该配置可以清晰的看到走了两条路,一个走公网,一个走内网
四:增加环境变量
export GOPROXY="http://127.0.0.1:6666
五:验证
1、拉取外部包:
go get github.com/tal-tech/go-zero
通过nginx的日志就可以看到详细的请求
2、拉取内网包:
go get gitlab.yourdomain.com/demo/myproject@v0.0.1
然后可以看到
$ ls /data/athens/storage/gitlab.yourdomain.com/demo/myprojectv0.0.1
总结:为什么要使用athens?
摘抄几段来自官方的话
不变性:
Go第一次向Athens请求依赖包时,Athens会从VCS(Github、Bitbucket等)获取。但一旦检索到该模块,它将永远保存在Athens的后端存储中,并且代理将不再返回到VCS中获取同一版本的依赖包。这就是雅典如何实现模块不变性。需要注意的是,后端存储掌握在您的手中
安全性:
软件包可能是恶意的,为了确保您的团队或公司不会安装此类恶意软件包,当go命令行请求一个被排除的模块(恶意软件)时,您可以让代理服务器返回500。这将导致构建失败,因为Go需要200 HTTP响应码。使用Athens,您可以通过过滤器(filter)文件实现此目的。
文章转载自码农半亩田,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




