Go Mod引用私有库
在Go 1.11之后推出了依赖包管理工具Go Modules之后,Go项目可以在 GOPATH 之外的位置创建,当项目中仅使用了公有库作为依赖时,使用 go get 或 go mod 更新依赖一切如初,没有任何问题。
由于Go Modules默认使用代理去更新依赖,所以当使用了私有仓库作为依赖时,Go更新依赖的相关命令将不再可用。
- 本文最新状态查看链接:Go Mod引用私有库
1. 基础方式:Golang私有项目的路径替换
如果私有项目A依赖另一个私有项目B,且通过go get无法获取权限,可以采用replace方式;
在A项目中的go.mod文件中,加入 replace 操作;
module gitlab.example.com/A
replace "gitlab.example.com/B" => "../B
- Go Get模式下,私有module多级引用:
go get your@master deps@master
2. 高级方式:go mod私有项目的访问
2.1. 配置go环境变量
go get通过代理服务拉取私有仓库(企业内部module或托管站点上的private库),而代理服务不可能访问到私有仓库,会出现了404错误. Go提供了一个方便的解决方案:GOPRIVATE环境变量。通过以下配置,可以实现更新私有库依赖。
go env -w GO111MODULE=on
2.2. 设置 Go GOPRIVATE 变量
# 配置多个私有项目地址
go env -w GOPRIVATE="gitlab.example.com"
# 其中gitee.com/user 是你的个人账户所在地址
2.3. Golang项目非代理NOPROXY配置
如果设置GONOPROXY和GONOSUMDB均为none,意味着所有module,不管是公共的还是私有的,都要经过proxy下载,经过sumdb验证;默认情况下,如果设置GOPRIVATE,会自动设置GONOPROXY和GONOSUMDB;即可不配置如下:
GONOPROXY= "gitlab.example.com"
GONOSUMDB= "gitlab.example.com"
3. Go到私有仓库的请求认证
3.1. 必要条件
- GitLab 实例必须能够通过HTTPS访问
- 必须拥有私有访问秘钥,或是access token,或是ssh key;
3.2. 方法一:Go请求的认证, 创建.netrc文件
创建文件 ~/.netrc
$ vi ~/.netrc
machine gitlab.example.cn
login <gitlab_user_name>
password <personal_access_token>
- Windows系统下, Go 读取文件为 ~/_netrc而不是Linux下的 ~/.netrc。
- Go命令不会在非安全链接下传输证书,所以它会通过Go创建的https请求完成认证,而不是通过Git创建的认证请求;
- personal_access_token申请如下
3.3. Git请求的认证
如果Go无法通过代理获取module,会使用Git。 Git使用.netrc文件完成认证请求,但是也可通过其他认证方法。下面也可通过Git配置:
3.3.1. 在请求URL中嵌入认证信息Access_Token
git config --global url."https://${user}:${personal_access_token}@gitlab.example.com".insteadOf "https://gitlab.example.com"
- Git全局配置查看和删除
#查看git全局配置
git config --global -l
# 删除url路径替换, 或是修改${GitProject}/.git/config文件中对应url
git config --global --unset url."git@gitlab.example.com".insteadOf
3.3.2. 使用SSH替换HTTPS进行认证
git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com"
- 多ssh认证
The explicit env settings are unnecessary
The tidy should be called before vendor to have a consistent state
You can setup git and ssh configs(~/.ssh/config) so they will automatically use the right profiles:
$ ~/.ssh/config
Host github-personalHostname github.com #网站地址User git #git ssh访问IdentityFile ~/.ssh/id_ed25519_personal #区别在于指定不通keyHost github-workHostname github.comUser gitIdentityFile ~/.ssh/id_ed25519_work# git配置
[url "git@github-work:"]insteadOf = "https://github.com/work/"
[url "git@github-personal:"]insteadOf = "https://github.com/personal/"
Gitlab Bug: Sub Groups
该问题,建议采用netrc的方式解决;直接可以规避SubGroups的bug问题;
4. Golang私有项目的http访问
如果私有库不支持https协议,会报如下的错误。这是因为Go更新依赖时,会强制校验CA证书来确保依赖库的安全性。
go: gitee.com/modules/project@v0.0.0-20200320063051-28c4ad7fe2ea: unrecognized import path "gitee.com/modules/project": https fetch: Get "https://gitee.com/modules/project?go-get=1": dial tcp 123.123.123:443: connect: connection refused
如果私有库不支持https协议,还需要go配置参数或环境变量,使其使用http方式访问
- 使用
go get -insecure
,这种方式不推荐,原因如下- 添加 -insecure 参数即表示更新依赖时可以不去校验CA证书,但是这会带来一个问题:范围无法界定(overkill),所有与要更新依赖相关联的依赖,均不会去做校验,可能会意外更新到不安全的依赖。
- -insecure 仅支持 go get 命令,不支持 go mod 命令,因此使用 go mod 命令时是无法更新不支持https协议的私有库的。
- 添加 GOINSECURE 参数,推荐这种方式
- 在Go 1.14中增加了新的环境变量,用于指定哪些域名下的仓库不去校验CA证书。
- 使用方式同 GOINSECURE 类似
go env -w GOINSECURE=gitee.com/user_name
5. 版本解决:invalid version: unknown revision 000000000000
在私有仓库中,暂时没有打tag指定版本。这里通过指定分支,实现对应hash值得指定;报错如下: gitlab.example.cn/projectB@v0.0.0-00010101000000-000000000000: invalid version: unknown revision 000000000000
修改go.mod指定库的版本到指定分支
//go.mod文件 module gitlab.example.cn/projectA go 1.16 require (//因projectB并没有打tag,这里通过指定master分支,自动获取其hash值;也可指定其他分支;gitlab.example.cn/projectB master )
执行
go mod tidy
命令,自动检出对应版本;go mod tidy #如果有层级依赖,采用如下方法 #go get your@master deps@master
查看配置自动更新如下:
//go.mod文件 module gitlab.example.cn/projectA go 1.16 require (//因projectB并没有打tag,这里通过指定分支,自动获取其版本值,版本号-时间戳-提交Hash值;gitlab.example.cn/projectB v0.0.0-20220523020601-cbdabf7b07db )
6. 参考文章
- Go 1.14解决Go Modules模式下更新私有库问题
- Unable to
go get
go-packages in repositories in nested sub groups deeper than 1 - Go Module 工程化实践(二):go get 取包原理篇
Go Mod引用私有库相关推荐
- node npm install引用安装依赖包更改为私有库地址
背景:项目使用了bpmn.js作为前端的流程引擎,但是需要更改配置文件和映射关系,或者直接修改源码,但是通过npm install安装的是默认的git 地址,于是就需要将bpmn.js拷贝一份到公司的 ...
- git公有转私有_【IT新手之路】客户端组件化之私有库搭建
背景 在组件化之前,小花钱包 App 项目代码,在代码结构,代码质量和层级划分上都处于一个比较乱的状态.这样的项目条件在业务发展不是很快的时候,是可以适应需求的,并且能一定程度地保证开发效率.但随着业 ...
- automake生成静态库文件_基于CocoaPods的组件化原理及私有库实践
轮子为什么会存在 智人能在残酷的进化大战中存活下来,原因之一就是智人懂得将知识沉淀成外物,辅助彼此之间的合作,从而使得整个群体产生了规模效应,即1+1>2的效果. 从一个角度上说,石器时代是基于 ...
- 模块化日常:开源库与私有库重名
主角:LPDNetworkingKit 起因:LPDNetworkingKit 本身是我们组在 GitHub 上开源的一个库,然后,哎嘿,不知道啥原因,我们内网 GitLab 上还有一个私有的 LPD ...
- conan入门(五):conan 交叉编译引用第三方库示例
conan 交叉编译引用第三方库示例 Conan 是 C 和 C++ 语言的依赖项和包管理器.它是免费和开源的,适用于所有平台(Windows.Linux.OSX.FreeBSD.Solaris 等) ...
- 搭建CocoaPods私有库
基于git搭建CocoaPods私有库 1.创建并设置一个私有的Spec Repo. 2.创建Pod的所需要的项目工程文件,并且有可访问的项目版本控制地址. 3.创建Pod所对应的podspec文件. ...
- 组件库(私有库)维护
上一篇(私有库搭建):https://blog.csdn.net/BUG_delete/article/details/100670099 在上一篇的基础上, 本篇进行远程私有仓库的版本升级: 1.我 ...
- CocoaPods - podspec私有库配置
工程引用 Podfile中添加以下cocoaPods指令,在终端输入pod install构建 source 'https://github.com/zhengmiaokai/Specs.git' p ...
- iOS-本地私有库搭建以及远程库制作
spec简介 查看本地pod仓库 ~/.cocoapods/repos Spec文件:描述框架信息 pod setup: 将远程仓库的.spec文件拉取到本地 pod install: 先从本地找到. ...
最新文章
- jQuery获取带点的id元素
- 【cs229-Lecture19】微分动态规划
- 正态随机分布 C++实现
- java static用法_Java中static关键字的作用和用法详细介绍
- 腾讯面试题Java 并发包之线程池综述
- 白鹭引擎开发飞机大战详尽教程(四控制飞机移动)
- sklearn朴素贝叶斯分类器_机器学习06——朴素贝叶斯
- 同步锁ReentrantLock
- Java基类共同属性设置_多选择基类的访问属性-Java初学笔记
- linux自动输入sudo密码_用大写字母输入 Linux 命令,实现以 sudo 用户权限运行
- Acer e5-571g 完美黑苹果10.13
- 金秋发布会·实在里程碑,从RPA 向 IPA 进军!
- 在线网页如何免费excel转pdf
- html autocomplete 多个参数切换
- pandas 第二章 pandas基础
- VirutualBox虚拟机内ubuntu扩充硬盘容量
- [普及] NOIP 2012 文化之旅
- 技术干货丨摄像头管理功能架构,EdgeX ONVIF/USB 管理和推理平台
- 基于Matlab深度学习Yolov4-tiny的交通标志识别道路标志识别检测
- python找最小值_Python,lambda,找到最小值