从Glide迁移到Go Mod:Golang依赖管理工具转换指南

从Glide迁移到Go Mod:Golang依赖管理工具转换指南 我正在使用 Go 版本 1.14。到目前为止,我们一直使用 glide 包管理器来安装私有和公共仓库的包。

现在,当我尝试从 glide 迁移到 go mod 时,在执行 go mod init 时遇到了错误。 它读取了由 glide.yaml 创建的 go.mod 文件中的公共仓库,但对于私有仓库,我遇到了错误。

我们的私有仓库在 Bitbucket 上。

您能指导一下逐步迁移的步骤吗?

我需要部署相同的配置。

2 回复

你遇到了什么类型的错误?不过,看起来你的问题与私有仓库和公共代理有关。我在这里描述过:https://developer20.com/golang-tips-and-trics-vii/

更多关于从Glide迁移到Go Mod:Golang依赖管理工具转换指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


从Glide迁移到Go Modules时处理私有仓库需要额外配置。以下是具体步骤:

1. 配置Git访问私有仓库

首先确保Git能访问Bitbucket私有仓库。对于SSH方式:

# 测试SSH连接
ssh -T git@bitbucket.org

对于HTTPS方式,配置Git凭证存储:

git config --global credential.helper store

2. 设置Go Modules代理和私有仓库

创建或编辑 ~/.gitconfig 文件:

[url "git@bitbucket.org:"]
    insteadOf = https://bitbucket.org/

设置Go环境变量:

# 允许访问私有仓库
export GOPRIVATE=bitbucket.org/yourcompany

# 或者设置多个私有仓库
export GOPRIVATE=bitbucket.org/yourcompany,bitbucket.org/anotherrepo

# 禁用代理对私有仓库的访问
export GONOPROXY=bitbucket.org/yourcompany
export GONOSUMDB=bitbucket.org/yourcompany

3. 迁移步骤

# 备份现有配置
cp glide.yaml glide.yaml.backup
cp glide.lock glide.lock.backup

# 初始化go.mod,指定正确的模块路径
go mod init bitbucket.org/yourcompany/projectname

# 尝试tidy,可能会遇到私有包错误
go mod tidy

# 如果遇到认证错误,手动添加replace指令

4. 处理glide.yaml中的私有依赖

编辑生成的go.mod文件,手动添加私有依赖:

module bitbucket.org/yourcompany/projectname

go 1.14

require (
    github.com/public/pkg v1.2.3
    bitbucket.org/yourcompany/private-repo v0.1.0
)

replace bitbucket.org/yourcompany/private-repo => ../private-repo

或者使用本地路径替换:

replace bitbucket.org/yourcompany/private-repo => ./vendor/bitbucket.org/yourcompany/private-repo

5. 使用vendoring模式(如果需要)

# 启用vendor模式
go mod vendor

# 构建时使用vendor目录
go build -mod=vendor

6. 完整迁移脚本示例

#!/bin/bash
# migrate_glide_to_gomod.sh

export GOPRIVATE="bitbucket.org/yourcompany/*"
export GO111MODULE=on

# 清理旧缓存
go clean -modcache

# 初始化模块
go mod init $(git config --get remote.origin.url | sed 's/\.git$//' | sed 's/.*://')

# 尝试更新依赖
go mod tidy 2>&1 | tee mod_errors.log

# 如果有私有包错误,手动处理
echo "处理私有依赖..."
for pkg in $(grep "bitbucket.org/yourcompany" glide.yaml | awk '{print $2}'); do
    echo "添加私有包: $pkg"
    go get $pkg
done

# 最终整理
go mod tidy
go mod vendor

7. Docker部署配置

在Dockerfile中配置私有仓库访问:

FROM golang:1.14-alpine

# 安装Git和SSH客户端
RUN apk add --no-cache git openssh-client

# 配置SSH密钥(通过Docker secret或build argument)
ARG SSH_PRIVATE_KEY
RUN mkdir -p /root/.ssh && \
    echo "$SSH_PRIVATE_KEY" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa

# 配置Git
RUN echo "StrictHostKeyChecking no" >> /root/.ssh/config

# 设置Go环境
ENV GOPRIVATE=bitbucket.org/yourcompany
ENG GO111MODULE=on

WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o app .

8. 验证迁移

创建测试文件验证导入:

// main_test.go
package main

import (
    "testing"
    _ "bitbucket.org/yourcompany/private-repo"
    _ "github.com/public/pkg"
)

func TestImports(t *testing.T) {
    // 如果编译通过,说明导入成功
    t.Log("所有依赖导入成功")
}

运行测试:

go test -v

9. 持续集成配置

在CI/CD中配置环境变量:

# .gitlab-ci.yml 或类似配置
variables:
  GOPRIVATE: "bitbucket.org/yourcompany"
  GIT_STRATEGY: clone
  GIT_SUBMODULE_STRATEGY: recursive

before_script:
  - mkdir -p ~/.ssh
  - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - echo "Host bitbucket.org" >> ~/.ssh/config
  - echo "  IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config

这些步骤应该能解决从Glide迁移到Go Modules时遇到的私有仓库访问问题。关键点是正确配置GOPRIVATE环境变量和Git的认证方式。

回到顶部