Golang初学者物语(第4章:本地仓库中的共通模块管理)
首先
Golang系列第四篇。
前面三篇在这里。
-
- Golangはじめて物語(APIGateway+Lambdaといっしょ編)
-
- Golangはじめて物語(第2話: Gin+ECS+Fargateといっしょ編)
- Golangはじめて物語(第3話: CodePipeline+SAM+LambdaでCI/CD編)
好吧,一般来说,使用 import 命令从 GitHub 上获取 Golang 的公共库是常见的做法,但是在开发过程中,肯定会遇到“必须要创建共享模块,但是又不能在 GitHub 上存放源代码,因为公司规定不允许”的困扰。可能会有很多人想吐槽,但这个问题确实会出现。
如果用Java的话,可以使用CodeArtifact等工具将本地存储库委托给AWS,但Golang不支持这一点。事实上,也没有必要支持。如果使用Golang,只需要直接使用CodeCommit就可以了。
共通模块方面
在CodeCommit上创建以下目录结构的模块。
这次我们来创建一个简单的自定义日志记录器,只需将结果输出到标准输出。
.
├── mylogger
│ ├── go.mod
│ └── mylogger.go
└── README.md
package mylogger
import (
"log"
)
func OutputLog(str string) {
log.Printf(str)
}
module git-codecommit.[リージョン名].amazonaws.com/v1/repos/[リポジトリ名].git/mylogger
go 1.13
require (
)
重点是在module的仓库名称后面加上.git。
如果忘记这一点,它将无法正常运行。
处理呼叫的一方
在调用的一方面,可以按照以下方式进行导入。
import (
"git-codecommit.[リージョン名].amazonaws.com/v1/repos/[リポジトリ名].git/mylogger"
)
如果使用 go.mod 文件,则在编译时
require (
git-codecommit.[リージョン名].amazonaws.com/v1/repos/[リポジトリ名].git/mylogger v0.0.0-20201011112107-e103759ebd6b
)
请以中文为母语将以下内容改写,只需要一种表达方式:
帮忙填写一个很不错的版本。
※当然,根据需要指定版本。
在建立时
$ export GOPRIVATE=git-codecommit.[リージョン名].amazonaws.com,direct
我們這麼做吧。如果不這樣做的話,就無法正確地訪問私有存儲庫,導致構建失敗。
如果要将CodePipeline(CodeBuild)集成到项目中
这也基本一样,没有什么区别。
通过Buildspec的环境变量设置私有仓库的配置。
env:
variables:
GOPRIVATE: git-codecommit.[リージョン名].amazonaws.com,direct
另外,在CodeBuild中,我们可以使用IAM角色对CodeCommit进行验证。因此,在预构建阶段,请设置以下配置。
pre_build:
commands:
- git config --global credential.helper '!aws codecommit credential-helper $@'
- git config --global credential.UseHttpPath true
如果使用CodePipeline,获取源代码是由CodePipeline自行操作并将其存储到S3存储桶中,然后与CodeBuild协同工作。因此,通常情况下不需要访问CodeCommit的权限。但是,如果使用这种方法,则CodeBuild将直接访问CodeCommit,因此需要具有Read访问权限。请确保为CodeBuild的服务角色授予与AWSCodeCommitReadOnly等同的权限(虽然可以进一步缩小权限,但是想得太多了,有点力不从心……)
谈到这一点,如果要处理CodeBuild的本地缓存,对于Go语言来说,默认情况下应该设置以下路径,这样会很好。
cache:
paths:
- '/go/pkg/mod/**/*'
现在,我们可以自由地制作共享库,没有任何限制了!