如何解决离线环境下golang开发时依赖的问题?

Go在联网环境下开发可以使用go mod tidy联网拉取项目所需依赖包,
而离线环境下,本人了解到,只能单个项目中使用vendor解决包依赖,但是一旦该项目导入包有变化就会失效。
而且vendor仅对当前项目有效,其他项目不能引用vendor中的包。
这导致离线环境的Go开发寸步难行。往往用Go卡在这里后,我就只能转用Python在离线内网开发。

想请教大佬们

  1. 如何在内网(不能连互联网)搭建goproxy服务,让新旧项目都能重复共享使用特定的包.
  2. 其所需的包如何下载和转移至内网.
  3. 如何解决sum的问题等等?
    越详细越好。

网上关于Google官方的goproxygoproxy.io搭建goproxy服务的文章,都是基于能联网的公司内网场景。

阅读 4.4k
2 个回答

Online 端:

  1. 新建项目目录及 go 文件,将需要移植到内网的依赖包的包名(import (_ "github.com/tidwall/gjson").....)写入 go 文件中。
  2. 然后利用 go mod vendor 命令,将依赖包打包到当前项目所在目录。
  3. 将当前项目目录下的 vendor 目录、 go.modgo.sum 三个东西拷贝到离线电脑中。

Offline

新建项目目录 offline_project (该名字为举例,实际随意),将前面第三步拷贝的三个东西拷贝进来,新建 go 文件,需要用到什么包就导入什么包 (如果导入的是第三方包前提是该包已经打包进了 vendor 目录中)

注意事项
Offline 端, import 的包如果只是 vendor 中的个别包,则 go.modgo.sum 可能会出现红点,此时千万不要使用 go mod 命令去整理,不要担心编译时会将 vendor 中的依赖包全部编译进去。

如何复用

要复用移植的第三方包,先将项目目录 offline_project 中除 vendorgo.modgo.sum 之外原有的项目文件(主要是 go 文件)移出当前目录或者更改后缀,然后再新建 go 文件。

怎么搭建Proxy我不清楚,但你可以把你需要的包,用git下载下来,放到一个统一的目录:

例如:统一存放在/cache中,包github.com/gin-gonic/gin的存放路径是/cache/github.com/gin-gonic/gin,并用git切换到相应版本上。

在工程里的go.mod中,上面的require部分不动,下面添加replace语句,例如:

replace github.com/gin-gonic/gin => /cache/github.com/gin-gonic/gin

后面路径是相对路径或绝对路径都可以,把所有包都replace了就行了。更新的话,通过覆盖和重新checkout缓存的git仓库就行了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题