简而言之,我的当前用例涉及在Docker容器内动态创建一个Golang插件。编译需要用户的一些新输入(这就是为什么它不是预先编译的原因),但依赖关系是静态的,不会改变。
目前,在Docker容器内从头开始完成整个编译(尽管使用了 go mod download 来减少时间)。我注意到 go build 命令最终会编译大量依赖项,这增加了插件编译的非平凡时间,影响了我的应用程序的可用性。
是否有 Go 支持的方法或命令来遍历 go.mod 文件并填充 GOCACHE 目录?有了这样一个命令,我会在 Dockerfile 中运行它,使 Docker 镜像包含所有已编译的构建依赖关系的缓存。
我尝试过的:
1. go mod download :这只下载依赖项;它不编译它们。 2. 我已经实现了一个临时解决方案:我创建了一个简单的 main.go,导入了所有依赖项,并在我的 Dockerfile 中运行 go build 来填充缓存。正如提到的那样,这确实解决了我的问题,但感觉有些巧妙。此外,如果将来依赖项发生更改,也需要有人进行更改,这并不理想。 3. 我在网上看到很多关于 CI/CD 的答案。使用 CI/CD,容器只需要将一个分区挂载到主机上,其中包含运行后保留的缓存。这不能解决我立即构建容器本身的问题。
目前,在Docker容器内从头开始完成整个编译(尽管使用了 go mod download 来减少时间)。我注意到 go build 命令最终会编译大量依赖项,这增加了插件编译的非平凡时间,影响了我的应用程序的可用性。
是否有 Go 支持的方法或命令来遍历 go.mod 文件并填充 GOCACHE 目录?有了这样一个命令,我会在 Dockerfile 中运行它,使 Docker 镜像包含所有已编译的构建依赖关系的缓存。
我尝试过的:
1. go mod download :这只下载依赖项;它不编译它们。 2. 我已经实现了一个临时解决方案:我创建了一个简单的 main.go,导入了所有依赖项,并在我的 Dockerfile 中运行 go build 来填充缓存。正如提到的那样,这确实解决了我的问题,但感觉有些巧妙。此外,如果将来依赖项发生更改,也需要有人进行更改,这并不理想。 3. 我在网上看到很多关于 CI/CD 的答案。使用 CI/CD,容器只需要将一个分区挂载到主机上,其中包含运行后保留的缓存。这不能解决我立即构建容器本身的问题。