Go Module 教程:使用 GitHub 私有仓库
在本文中,我们将讨论 go 模块的基本用法,如何创建自己的 go 模块以及如何在自己的 go 项目中包含安全的 go 模块。我们主要关注的是私有 git 存储库。
模块极大地提高了 go 代码的可维护性。就像 Java 应用程序中的 Maven 一样,它是 go 语言中的依赖项管理。如果您不熟悉 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)
- 模块:-通用模块
Go 模块的名称将为 "github.com/ereshzealous/common-module"
go mod init github.com/ereshzealous/common-module
让我们创建一个 commons 包,并编写一个带有几个示例函数的简单 go 文件。
package common
// GetCommonData a method
func GetCommonData() string {
return "Common Data"
}
func GetData() string {
return "Data"
}
现在继续,将 GitHub 中的 go 模块发布到一个版本。单击下面突出显示的一个,这会将您的 GIT 提交发布为公开状态。要了解如何发布 GIT 存储库,请单击 此处。
如果将此模块导入到您的 go 文件中,则函数是可见的,因为存储库尚未受限制。现在,将存储库从公有移动到私有。
开发者环境
让我们使用 go get 命令获取通用模块。您将看到 410 Gone 错误消息。
错误信息
要解决上述问题并在 go 应用程序中包含私有模块,需要两个步骤。
- 通过 Go Mod 代理网站
这是因为,就像 Maven default repo, Go 也有一个模块的代理站点 (https://proxy.golang.org,direct).
因为我们已在 GitHub 中发布了,所以我们必须提供一种绕过私有存储库代理站点的机制。可以使用 GOPRIVATE 实现。
新的环境变量
[GOPRIVATE](https://golang.org/cmd/go/#hdr-Module_configuration_for_non_public_module)
环境变量指示不可公开的模块路径。它是较低级别的GONOPROXY
和GONOSUMDB
两个变量的默认值,这两个变量提供了对通过代理获取哪些模块并使用校验和数据库进行验证的更细粒度的控制。
在如下所示开发环境中设置 GOPRIVATE。多个值用逗号分隔。下面我已经设置为我的帐户级别,我们也可以设置为存储库级别,如 github.com/ereshzealous/common-module
go env -w GOPRIVATE=github.com/ereshzealous
2. 在构建期间将存储库凭证传递给 Go 模块
当我们使用 Github 时,我们必须在构建过程中提供 auth 令牌。在开发环境中,它是直截了当的。我们有一个 git 命令可以做到这一点,即在 gitconfig 文件中添加一个条目。必须传递格式化的 URL,以便在构建过程中评估凭据。
Note: Auth 令牌必须是 URL 编码的。
单击 此处 转到GitHub 访问令牌。创建具有适当权限的用户。创建一个新令牌或使用现有令牌。
生成令牌后,请执行以下命令。
Github
git config --global url."https://${username}:${access_token}@github.com".insteadOf /
"https://github.com"
Bitbucket
在 Bitbucket 中,创建访问令牌并执行以下命令。
git config --global url."https://${bitbucket_user_id}:${bitbucket_access_token}@privatebitbucket.com".insteadOf
"https://privateaccount.com"
在 gitconfig 中设置以上内容之后,让我们尝试再次获取 go模块。
这适用于开发环境,CI/CD 或 docker 容器如何呢。
Docker
幸运的是,我们可以在 Docker file 中这样做。下面是我们的方法。
# 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 设置了访问令牌和用户名。这会将凭证传递给 Go Mod。至此,我们在 docker 中有了 git image。
让我们看看 docker 执行的控制台。
Docker 快照
Pvt 是一个私有存储库。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: