Go Module:使用 GitHub 私有仓库(译文) | Go主题月

2,005 阅读4分钟

Eresh Gorantla

2020年2月13日

在本文中,我们将讨论 go 模块的基本用法,以及如何创建我们自己的 go 模块,以及如何在自己的 go 项目中包含安全的 go 模块。我们主要关注的是私有 git 存储库。

image.png

模块极大地提高了 go 的代码可维护性。它是 go 语言中的依赖项管理,就像 Java 应用程序中的 Maven 一样。如果您对 go 中的模块不熟悉,请单击此处获取官方文档。

创建自己的 go 模块

在 Java 中,工件是在 Nexus 这样的存储库中维护的。类似地,我们可以在 Git 或 Bitbucket 上托管自己的 go 模块。我们在 Github 托管。

必须为 GoLang 配置好所有与环境相关的东西。否则,它将无法按预期工作。

切换到一个目录并创建一个文件夹 common-module

mkdir common-module
cd common-module

用一个名称初始化项目中的 Go 模块。名字格式是

<hosting-site>/<repository>/<module>
  • 托管站点:- github.com
  • 资料库:- myrepo (ereshzealous)
  • 模块:- common-module

go 模块的名字将为 github.com/ereshzealous/common-module

go mod init github.com/ereshzealous/common-module

让我们创建一个 commons 包并编写一个简单的包含一些示例函数的 go 文件。

//commons.go

package common

// GetCommonData a method
func GetCommonData() string {
	return "Common Data"
}

func GetData() string {
	return "Data"
}

现在继续,在 GitHub 中将 go 模块发布到一个版本。点击下面突出显示的一个,这将释放你的 GIT 提交为 public 。要了解如何发布到 github,请单击此处

image.png

如果在你的 go 文件中导入此模块,则这些函数是可见的,因为存储库没有限制。现在将存储库从 public(公共的)移到 private(私有的)。

开发环境

让我们使用 go get 命令来获取公共模块。您将看到 410 Gone 错误消息。

image.png

要解决上述问题并在 go 应用程序中包含私有模块,需要两个步骤。

  1. 通过 go mod 代理站点

这是因为就像 Maven defaultrepo Go 一样, Go 模块代理站点还有一个代理站点(proxy.golang.org,direct)。

但是我们在 github 中发布了,所以我们必须提供一种机制来绕过私有存储库的代理站点。这可以通过使用 GOPRIVATE 来实现。

新的 GOPRIVATE 环境变量表示不公开的模块路径。它充当较低级别的 GONOPROXY 和 GONOSUMDB 变量的默认值,这两个变量提供了更细粒度的控制,控制哪些模块是通过代理获取的,哪些模块是使用校验和数据库验证的。

在开发环境中设置 GOPRIVATE ,如下所示。多个值用逗号分隔。下面我已经设置为我的帐户级别,我们也可以设置为存储库级别,如 github.com/ereshzealous/common-module

go env -w GOPRIVATE=github.com/ereshzealous
  1. 在构建期间向 Go 模块传递存储库凭据

当我们使用 Github 时,我们必须在构建期间提供 auth token。在开发环境中,这是直截了当的。我们有一个 git 命令来执行此操作,即在 gitconfig 文件中添加一个条目。必须传递格式化的 URL ,以便在生成过程中评估凭据。

注意:auth token 必须是 URL 编码的。

单击此处转到 GitHub 访问 token。创建一个具有适当权限的。创建一个新 token 或使用现有token。

image.png

生成 token 后,执行以下命令。

Github

//git.txt

git config --global url."https://${username}:${access_token}@github.com".insteadOf /
"https://github.com"

Bitbucket

在 Bitbucket 中,创建一个访问 token 并执行以下命令。

//bitbucketconfig

git config --global url."https://${bitbucket_user_id}:${bitbucket_access_token}@privatebitbucket.com".insteadOf 
  "https://privateaccount.com"

在 gitconfig 中设置了以上内容之后,让我们再次尝试获取 go 模块。

image.png

这适用于开发环境,CI/CD 或 docker 容器化如何。

Docker

幸运的是,我们可以在 Docker 文件中这样做。我们是这样做的。

//Dockerfile

# Start from the latest golang base image
FROM golang:alpine

RUN GOCACHE=OFF

RUN go env -w GOPRIVATE=github.com/ereshzealous


# Set the Current Working Directory inside the container
WORKDIR /app

# Copy everything from the current directory to the Working Directory inside the container
COPY . .

RUN apk add git

RUN git config --global url."https://golang:<access-token>@github.com".insteadOf "https://github.com"

# Build the Go app
RUN go build -o main .

# Expose port 8080 to the outside world
EXPOSE 8080

#ENTRYPOINT ["/app"]

# Command to run the executable
CMD ["./main"]

第 6 行

将 GOPRIVATE 设置为存储库。

第 17 行

gitconfig 设置了一个访问 token 和用户名。这将通过凭证给 go mod。为此,我们在 docker 中有了 git image。

让我们看看 docker 执行的控制台。

image.png

Pvt 是一个私有存储库。

原文链接: medium.com/swlh/go-mod…