【golang】go mod私有仓库配置

Golang版本控制

go version v1.22.0

当我们新建一个go项目时,在项目根目录下执行go mod init可以初始化go.mod文件用于管理包依赖。后续执行go mod tidy更新并下载所有的依赖包。
如果我们没有进行配置,则只能访问公共开源仓库。如果想要下载私有仓库依赖包则需要进行一些配置。

go mod使用私有仓库(gitlab)依赖设置

假如想配置托管站点gitlab.example.cn,按照如下步骤操作:

  1. 设置GOPRIVATE环境变量,防止走代理:
    • go env -w GOPRIVATE=*.gitlab.example.cn/*
    • go env -w GONOPROXY=*.gitlab.example.cn/*
  2. 配置仓库访问权限,有两种方式:
    • 方式一(推荐): 配置git将请求从ssh转换为https:git config --global url."ssh://git@gitlab.example.cn/".insteadof "https://gitlab.example.cn/"
    • 方式二:添加仓库访问Token: git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN"
  3. 由于访问不到验证服务器,如下方式二选一:
    • 方式一:go env -w GONOSUMDB=gitlab.example.com/*
    • 方式二:关闭验证服务 go env -w GOSUMDB=off
  4. 如果私有库不支持https协议,设置跳过CA证书校验:go env -w GOINSECURE='gitlab.example.com/*'

配置完成后可以git config -l查看git配置,也可以通过.gitconfig直接编辑git配置:

[http]
	extraheader = PRIVATE-TOKEN:UsQsxy5q_Nqy-pXHtu-V
	
[url "ssh://git@gitlab.example.cn/"]
	insteadof = https://gitlab.example.cn/

通过go env查看环境变量配置,也可以直接通过profile配置环境变量:

export GOPRIVATE=*.gitlab.example.com/*
export GONOPROXY=*.gitlab.example.com/*
export GOINSECURE=*.gitlab.example.com/*
export GONOSUMDB=*.gitlab.example.com/*

配置代码托管站点

Go mod寻找代码仓库原理

https://pkg.go.dev/cmd/go#hdr-Remote_import_paths

如果import路径不是已知的代码托管站点并且也缺少版本控制限定符,则go工具会尝试通过https/http获取导入并在文档的HTML <head>中查找<meta>标记。

元标记的形式如下:

<meta name="go-import" content="import-prefix vcs repo-root">

使用mod时,会识别go-import元标记的附加变体,并且优先级高于那些默认的版本控制系统。该变体使用mod作为内容值中的vcs,如下所示:

<meta name="go-import" content="example.org mod https://code.org/moduleproxy">

此标签表示从 URLhttps://code.org/moduleproxy上的模块代理中获取路径以 example.org开头的模块。有关代理协议的详细信息, 请参阅https://golang.org/ref/mod#goproxy-protocol 。

查找模块路径的存储库:https://go.dev/ref/mod#vcs-find

使用代理实现代码托管站点访问

一般主流的代码托管站站点如github,gitlab,Gitee等,都默认支持返回站点的golang mod元数据。
如果无法对外暴露站点的域名,且甚至无法拥有更改站点访问地址的权限。比如,部署站点的时候是以ip+port的方式访问。这时需要配置一个虚拟的域名作为go mod的引用包路径,这时可以使用Nginx配置站点的内网访问代理,返回带有元标记的静态页面。例如要访问站点gitlab.example.com

if ($args ~* "^go-get=1") {
                        set $condition goget;
        }
        if ($uri ~ "(/[^/]+/[^/]+)(/.*)?") {
                        set $condition "${condition}path";
        }
        if ($condition = gogetpath) {
                        return 200 "<!DOCTYPE html><html><head><meta content='gitlab.example.com$1 git https://gitlab.example.com$1.git' name='go-import'></head></html>";
        }

参考:https://stackoverflow.com/questions/26347516/using-go-get-on-a-personal-git-repo

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值