一篇文章彻底弄懂Golang私有仓库配置问题

这篇具有很好参考价值的文章主要介绍了一篇文章彻底弄懂Golang私有仓库配置问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言:

一般通过 go get 拉取的是公共仓库的代码(如: github.com中的代码),是不需要任务权限就能拉下来。但当我们配置的私有仓库一般都需要用户名密码来登录才能拉取代码,所以私有仓库主要是解决认证问题。

了解 go get

在早期版本的Go中,“go get”用于构建和安装包。现在,“go get”专门用于调整go.mod中的依赖项,即下载所需要的包。'go install'可以用来构建和安装命令。go get通常也是使用 git、svn等工具进行拉取所需要的包。怎么决定使用哪个工具呢?

1. 通过静态方式

1.1 通过仓库域名

例如:go get github.com/example/pkg

域名为github.com go就直接使用 git 工具进行拉取。

1.2 通过后缀

例如:go get github.com/example/pkg.git

后缀为.git,也直接使用 git 工具进行拉取。

2. 通过动态方式

选择动态方式是因为域名和后缀都无法判断仓库类型,所以一般私有的仓库会使用动态方式。

通过在go get 命令中加 -v参数能够看到将请求的结果 go get -v git.test.com/example/pkg

2.1 询问仓库

go get 时,go 会先使用 //git.test.com/example/pkg?go-get=1 请求再从结果中判断使用哪个工具拉取。

2.2 分析结果

返回结果如下:

<html>
	<head>
		<meta name="go-import" content="git.test.com/example/pkg git http://git.test.com/example/pkg.git" />
		<meta name="go-source" content="git.test.com/example/pkg http://git.test.com/example/pkg http://git.test.com/example/pkg/-/tree/master{/dir} http://git.test.com/example/pkg/-/blob/master{/dir}/{file}#L{line}" />
	</head>
	<body>go get http://git.test.com/example/pkg</body>
</html>

其中:<meta name="go-import" content="git.test.com/example/pkg git http://git.test.com/example/pkg.git" />content的值分3段,格式为:

<meta name="go-import" content="root-path vcs repo-url" />

  • root-path: 模块名字,如:git.test.com/example/pkg

  • vcs: 使用的管理工具,如: git

  • repo-url:指的是模块原代码存放在哪个仓库下面,该仓库就需要是协议加仓库地址的形式。如:http://git.test.com/example/pkg.git

那么go就知道使用哪个工具拉取包了。

git认证

知道从哪里拉取、怎么拉取,正常就可以拉取go包了,但私有仓库需要git认证。git拉取代码认证的方式有3种:

URI的完整格式:

schema://username:password@host:port?query#fragment

  • schema: 协议,如http/https/ftp等

  • username: 用户名

  • password: 密码

  • host: ip或域名

  • port: 端口

  • query: 查询字符串

  • fragment: 锚点

1. 用户名、密码

需要在拉取时输入用户名密码,但go get时禁止交互(弹框,提示输入用户名密码),我们可以参考URI格式使用 URL中添加用户名密码,即可。但我们go get时也没办法去改这个呀,后面介绍使用 git的 insteadof解决。

如:http://root:passpwd@git.test.com/example/pkg

2. 用户名、access token(推荐使用)

作用和功能同1中的用户名、密码。只是一般用户名密码是用来登录的,如果把密码暴露了(因为这种认证会保存在git配置中,后面会介绍)就不太好了,本来只想让程序去拉取一个仓库代码,结果别人知道密码了,直接登录上去了。token生成时是可以设置权限的,更为安全,使用在拉取代码时只给 read_repository权限即可。

3. ssh

可以在本地创建非对称的加密对(ssh-keygen)。把公钥放到仓库里面去。

git的insteadof

git的insteadof在拉取代码,发送请求前替换请求地址。格式如下:

git config --global url."https://$GIT_USER:$GIT_TOKEN@$GOPRIVATE".insteadOf "https://$GOPRIVATE"

表示在请求 https://$GOPRIVATE 仓库时,会被替换成 https://$GIT_USER:$GIT_TOKEN@$GOPRIVATE,即包含了用户名和密码,所以会拉取成功。

注:必须设置成 --global 与 --system,git 支持 --global、--local、--system。

  • --system 作用范围太大了,此机器的其他用户或项目都使用了此设置。

  • --local只能针对当前项目(所以必须在项目所在目录,它会找.git目录中的设置),go使用git命令时目录可能存在问题。【未验证】

例如:

git config --global url."https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com".insteadOf "http://git.test.com"

表示在请求http://git.test.com私有仓库的包时会被替换成https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com,这里的root是仓库的用户名,VUQsGPQdxy5CDQ9xEs24是access token,

注:网上有人说 insteadOf后面的域名必须带 /http://git.test.com/,insteadOf前端字符串必须带:,即:https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com:。可能是平台或配置原因。根据自己的实际情况替换即可。

例如:

go get -v git.test.com/example/pkg 前,先通过 //git.test.com/example/pkg?go-get=1 进行访问,看返回的页面的实际协议,如我这里body中的:go get http://git.test.com/example/pkg

那么说明我的go get git.test.com/example/pkg 将被替换为`go get http://git.test.com/example/pkg(注:go 自动完成)

这时我需要将用户名和access token,添加上,所以要把 http://git.test.com 替换为https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com(需要我们手动配置git config)

最终替换完的结果将是:https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com/example/pkg

这时go会使用最终的地址进行git clone https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com/example/pkg

完整流程

  1. 1.

    在GOPRIVATE环境变量中加入私有仓库地址。

    go env -w GOPRIVATE=git.test.com

    此时另外两个GO的环境变量正常也会自动被设置与GOPRIVATE设置的值相同:(如果没有改过来,请自行检查并修改)

    set GONOPROXY=git.test.com  # 拉取git.test.com时不使用GOPROXY代理服务器
    set GONOSUMDB=git.test.com  # 拉取包成功后不进行签名校验,因为我们的私有库没有生成签名
  2. 2.

    设置git config地址替换

    git config --global url."https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com".insteadOf "http://git.test.com"

    这个设置会被保存在git全局的配置文件中。如我的window位置为:C:\Users\lxz\.gitconfig文件

    内容如下:

    ...省略不相关的配置
    [url "https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com"]
    	insteadOf = http://git.test.com

    小知识点:引号中的内容会被设置在配置项目名称后面,中括号内(如:https://root:...),不带引号被设置在配置项内部(如: insteadOf

  3. 3.

    进行拉取即可

    go get git.test.com/example/pkg

其他

1. 有时候配置了 git config 的insteadOf 后还是不好使,可能是因为之前设置过,需要把之前的删除。

先查看所有设置

> git config --global -l

# 结果显示

...省略不相关的配置
url.https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com.insteadof=http://git.test.com
...省略不相关的配置

再进行删除(复制=号之前的所有字符串)

git config --global --unset url.https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com.insteadof

2. 凭证管理

git凭证管理和git本身是两个独立的程序,凭证管理工具位置有git安装目录中,例如我的目录C:\Program Files\Git\mingw64\libexec\git-core下会有:

git-credential-cache.exe
git-credential-cache--daemon.exe
git-credential-manager-core.exe
git-credential-store.exe
git-credential-wincred.exe

查看git使用的凭证管理工具:

> git config --list

...省略不相关的配置
credential.helper=manager-core
credential.helper=store 
...省略不相关的配置

Git 甚至允许你配置多个辅助工具。 当查找特定服务器的凭证时,Git 会按顺序查询,并且在找到第一个回答时停止查询。 当保存凭证时,Git 会将用户名和密码发送给 所有 配置列表中的辅助工具,它们会按自己的方式处理用户名和密码。

注意,这里的manager-corestore分别对应目录C:\Program Files\Git\mingw64\libexec\git-core下的git-credential-manager-core.exegit-credential-store.exe。当然你也可以自己写一个辅助工具,放在这个目录里。例如你开发一个:foo的工具,你设置时使用git config --global credential.helper foo,你的文件名称应该为:git-credential-foo.exe

git-credential-manager-core.exe是微软开发的工具,它把凭证保存在了windows的凭证管理中。控制面板\用户帐户\凭证管理\管理windows凭证中。所以有时有的人把 git config中的insteadof已经删除了,但还可以正常拉取。是因为系统已经把凭证保存起来了,我们拉取代码的时候git自动从凭证管理功能中获取到凭证,再拼接上进行请求。

3. go mod cache

go get 拉取代码时后在$GOPATH/pkg/下生成缓存,而且会有2级缓存。

第1级缓存:首先会在$GOPATH/pkg/mod/cache目录中下载所需要的包,以压缩所格式保存。

第2级缓存:在$GOPATH/pkg/mod中解压cache中的包,放在与cache目录同级。

这样我们 go get 时会先检查第2级缓存,如果不存在,再去检查第1级缓存,如果都不存在再连网去仓库拉取包,并生成缓存。

可以手动删除缓存或通过命令(命令会将整个$GOPATH/pkg/mod目录删除):

go clean -modcache

所以有时在认证后拉取的包缓存在了本地,即使认证的access token或密码修改了,再go get或go mod tidy时也可以成功使用包,也可能是使用了之前的缓存。

参考文章

Git - 凭证存储

Git 凭据保存、如何修改_git凭据怎么设置_薛瑄的博客-CSDN博客

私有化仓库的 GO 模块使用实践 - 知乎

Go Modules Reference - The Go Programming Language

点击查看更多文章

更新精彩文章请关注微信公众号:大胡几哥哥文章来源地址https://www.toymoban.com/news/detail-792975.html

到了这里,关于一篇文章彻底弄懂Golang私有仓库配置问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一篇文章弄懂Oracle和PostgreSQL的Database Link

    🏆 文章目标:本篇介绍Oracle和PostgreSQL的Database Link 🍀 一篇文章弄懂Oracle和PostgreSQL的Database Link ✅ 创作者:Jay… 🎉 个人主页:Jay的个人主页 🍁 展望:若本篇讲解内容帮助到您,请帮忙点个赞吧,再点点您的小手关注下,您的支持是我继续写作的最大动力,谢谢🙏 作为回

    2024年02月06日
    浏览(52)
  • FPGA入门系列(1)产品选型(一篇文章弄懂FPGA不同系列)

    Xilin的FPGA芯片可以分为多个系列,我们常见的7系列、UltraScale、UltraScale+。 根据不同的工艺可以划分为45nm、28nm、20nm、16nm,可以划分为: 特别的在这些系列之外,还有ZYQN。这个系列主要的特点是在具备FPGA功能外,还额外封装了一个处理器,比较的常见的是ZYNQ-7000系列,便宜

    2024年04月14日
    浏览(61)
  • 一篇文章让你弄懂分布式一致性协议Paxos

    Paxos算法由Leslie Lamport在1990年提出,它是少数在工程实践中被证实的强一致性、高可用、去中心的分布式协议。Paxos协议用于在多个副本之间在有限时间内对某个决议达成共识。Paxos协议运行在允许消息重复、丢失、延迟或乱序,但没有拜占庭式错误的网络环境中,它利用“大

    2024年02月09日
    浏览(44)
  • 一篇文章彻底清楚shellcode(精品)

    1.没开沙箱(此时我们可以系统调用get shell) (一)32位程序系统调用 32位程序有别于64位程序,32位通过栈传参,我们常用的寄存器有4个数据寄存器(eax,ebx,ecx,edx),2个变址寄存器(esi,edi),2个指针寄存器(esp,ebp). 下边我们就来看一种系统调用方式及其构造: 执行上述shellcode即可g

    2024年02月09日
    浏览(43)
  • 一篇文章彻底理解自定义View

    目录 一.View的基础  1.view的基础概念 2.view的位置和事件event几种表示法 3.view的滑动

    2024年02月01日
    浏览(48)
  • 一篇文章,带你彻底掌握接口测试!

    一、什么是接口测试? 所谓接口,是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试,则是通过接口的不同情况下的输入,去对比输出,看看是否满足接口规范所规定的功能、安全以及性能方面的要求。 二、为什么要

    2024年02月10日
    浏览(53)
  • 读这篇文章让你彻底了解Redis

    你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也随之暴涨,而每一个用户请求都变成了对它的一

    2024年02月04日
    浏览(46)
  • Unity/C#------委托与事件(一篇文章彻底搞懂...)

            所有的代码语言创造者母语都是英语,我们从英语翻译到中文的过程中难免会存在一些不太能还原本意的词,比如我之前一直不理解构造函数和析构函数,只知道这俩货作用相反,直到我看到了它的英文意思,Construstor/Distructor,我才彻底理解了他们的作用。      

    2024年02月06日
    浏览(50)
  • Hive详解(一篇文章让你彻底学会Hive)

    概述 Hive是由Facebook(脸书)开发的后来贡献给了Apache的一套数据仓库管理工具,针对海量的结构化数据提供了读、写和管理的功能。 图-1 Hive图标 Hive本身是基于Hadoop,提供了类SQL(Hive Query Language,简称为HQL)语言来操作HDFS上的数据,而底层实际上是将用户书写的SQL转化为了MapR

    2024年04月12日
    浏览(47)
  • 【跨域】一篇文章彻底解决跨域设置cookie问题!

    大家好我是雪人~~⛄ 之前做项目的时候发现后端传过来的 SetCookie 不能正常在浏览器中使用。 是因为谷歌浏览器新版本Chrome 80将Cookie的SameSite属性默认值由None变为Lax。 接下来带大家解决该问题。 我们可以看到Cookie有以下属性 Cookie属性 名称 :Cookie的name。 值 :Cookie的value。

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包