2020年2月13日
在本文中,我们将讨论 go 模块的基本用法,以及如何创建我们自己的 go 模块,以及如何在自己的 go 项目中包含安全的 go 模块。我们主要关注的是私有 git 存储库。
模块极大地提高了 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,请单击 此处 。
如果在你的 go 文件中导入此模块,则这些函数是可见的,因为存储库没有限制。现在将存储库从 public(公共的)移到 private(私有的)。
开发环境
go get
要解决上述问题并在 go 应用程序中包含私有模块,需要两个步骤。
- 通过 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
- 在构建期间向 Go 模块传递存储库凭据
当我们使用 Github 时,我们必须在构建期间提供 auth token。在开发环境中,这是直截了当的。我们有一个 git 命令来执行此操作,即在 gitconfig 文件中添加一个条目。必须传递格式化的 URL ,以便在生成过程中评估凭据。
注意:auth token 必须是 URL 编码的。
单击 此处 转到 GitHub 访问 token。创建一个具有适当权限的。创建一个新 token 或使用现有token。
生成 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 模块。
这适用于开发环境,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 执行的控制台。
Pvt 是一个私有存储库。