美好的一天!我尝试从滑行迁移到模块(私有gitlab仓库) 并通过ssh签出代码
我有一个简单的项目,从私有gitlab存储库导入。
go.mod如下:
module my.private.package/modtest
go 1.12
require my.private.package/statistics v1.0.0
当我尝试构建我的应用程序或运行测试时,我得到:
go: my.private.package/statistics@v1.0.0: unrecognized import path "my.private.package/statistics" (parse https://my.private.package/statistics?go-get=1: no go-import meta tags ())
go: error loading module requirements
我试图将设置添加到git config:
[url "ssh://git@my.gitlab.server:9999"]
insteadOf = https://my.private.package
但仍然出现此错误。
有什么办法可以使它工作? 谢谢。
答案 0 :(得分:2)
我以前处理过Go模块和一个私有的GitLab。我们的私人GitLab有组和子组。您可能缺少的部分是~/.netrc
,并且您的全局git配置可能不正确。
我为此做了GitHub要点。您可以在这里找到它:https://gist.github.com/MicahParks/1ba2b19c39d1e5fccc3e892837b10e21
您可以在下面找到要点:
go
命令行工具需要能够从您的私有GitLab上获取依赖项,但是需要验证。
这假定您的私人GitLab位于privategitlab.company.com
。
建议使用以下环境变量:
export GO111MODULE=on
export GOPRIVATE=privategitlab.company.com
以上几行最适合您的Shell启动,例如~/.bashrc
。
GO111MODULE=on
告诉Golang命令行工具您正在使用模块。我没有用不使用的项目测试过
私有GitLab上的Golang模块。
GOPRIVATE=privategitlab.company.com
告诉Golang命令行工具不要将公共Internet资源用作主机名
列出(例如公共模块代理)。
要以后使用这些说明,请遵循this guide from the GitLab docs。
我知道read_api
范围是Golang命令行工具正常工作所必需的,我可能怀疑read_repository
为
很好,但尚未确认。
~/.netrc
为了使Golang命令行工具能够通过GitLab进行身份验证,最好使用~/.netrc
文件。
要创建该文件(如果不存在),请运行以下命令:
touch ~/.netrc
chmod 600 ~/.netrc
现在编辑文件内容以匹配以下内容:
machine privategitlab.company.com login USERNAME_HERE password TOKEN_HERE
将USERNAME_HERE
替换为您的GitLab用户名,而TOKEN_HERE
替换为您在GitLab中获得的访问令牌
上一节。
不要不使用以下方法设置全局git配置:
git config --global url."git@privategitlab.company.com:".insteadOf "https://privategitlab.company.com"
我相信在撰写本文时,Golang命令行工具不完全支持SSH git,这可能会导致
与~/.netrc
发生冲突。
要定期使用git
工具而不是Golang命令行工具,可以先设置一个~/.ssh/config
文件。
为此,请运行以下命令:
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config
请注意,上面文件和目录的权限是SSH的基本要求,SSH可以在以下默认配置下使用 大多数Linux系统。
然后,编辑~/.ssh/config
文件以匹配以下内容:
Host privategitlab.company.com
Hostname privategitlab.company.com
User USERNAME_HERE
IdentityFile ~/.ssh/id_rsa
请注意上述文件中的间距很重要,如果文件不正确,则会使文件无效。
其中USERNAME_HERE
是您的GitLab用户名,~/.ssh/id_rsa
是文件系统中SSH private 密钥的路径。
您已经将其 public 密钥上传到了GitLab。这是some instructions。
答案 1 :(得分:0)
我认为url配置应为ssh://gitlab@my.gitlab.server:9999
而不是ssh://git@my.gitlab.server:9999
,因为您使用的是gitlab私有存储库。
因此,配置应为:
[url "ssh://gitlab@my.gitlab.server:9999"]
insteadOf = https://my.gitlab.server
我希望可以对此发表评论,但是我的声誉还不够,所以我将其发布为答案。
答案 2 :(得分:0)
您正在使用哪个版本的Go?如果是Go 1.13或更高版本,则默认为通过proxy.golang.org下载模块。您可以使用GOPRIVATE
环境变量对一组特定的软件包进行更改。
这里是go help module-private
的引文,我强烈建议您全文阅读。直接提取模块后,应使用与之前模块相同的git
/ ssh
逻辑。
GOPRIVATE环境变量控制go命令的模块 认为是私人的(不公开),因此不应使用 代理或校验和数据库。该变量是逗号分隔的列表 模块路径前缀的全局模式(按照Go的path.Match的语法)。 例如,
GOPRIVATE = *。corp.example.com,rsc.io / private
使go命令将具有路径前缀的任何模块视为私有 匹配任何一种模式,包括git.corp.example.com/xyzzy、rsc.io/private, 和rsc.io/private/quux。