【问题标题】:Goland modules with private gitlab (ssh)带有私有 gitlab (ssh) 的 Goland 模块
【发布时间】:2021-07-14 06:47:27
【问题描述】:

美好的一天!我尝试从 glide 迁移到 go 模块(私人 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

但仍然出现此错误。

有什么方法可以让它工作吗? 谢谢你。

【问题讨论】:

  • 您的代码是否托管在您的自定义网站上?如果是这样,您应该让您的站点为包含 repo 信息的包返回 go get 的元标记。查看更多信息:golang.org/cmd/go/#hdr-Remote_import_paths
  • leaf bebop,我有一个私人 gitlab 服务器。 HTTPS - 禁止连接 - 仅限 ssh
  • 是的,我知道这一点。我问你的是实现 Go 的远程导入协议,由链接指定。问题不是你不能用 git 获取代码,而是它之前的步骤:知道从哪里获取代码,由go get 管理,使用远程导入协议。

标签: go go-modules


【解决方案1】:

我之前处理过 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 命令行工具不要将公共互联网资源用于主机名 列出(如公共模块代理)。

从您的私人 GitLab 获取个人访问令牌

为了将来证明这些说明,请关注this guide from the GitLab docs。 我知道 Golang 命令行工具需要 read_api 范围才能工作,我可能怀疑 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 替换为在 上一节。

常见错误

不要设置全局 git 配置,如下所示:

git config --global url."git@privategitlab.company.com:".insteadOf "https://privategitlab.company.com"

我相信在撰写本文时,Golang 命令行工具不完全支持 SSH git,这可能会导致 与~/.netrc 冲突。

奖励:SSH 配置文件

为了经常使用git 工具,而不是Golang 命令行工具,设置~/.ssh/config 文件很方便。 为此,请运行以下命令:

mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config

请注意,以上文件和目录的权限是 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

【讨论】:

    【解决方案2】:

    您使用的是什么版本的 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。

    【讨论】:

    • go help module-private 现在似乎是 go help private
    猜你喜欢
    • 2021-11-04
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多