-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 61 期 Go Modules、Go Module Proxy 和 goproxy.cn #468
Comments
期待 👍 |
@aofei 开始准备了吗。 |
@eddycjy 开始啦开始啦煎鱼哥,已经起头了😎 |
@aofei 棒棒的,PPT 可以先用 https://docs.google.com 做,等终稿了再下下来。 |
@aofei 下周四到你啦,预计几时可以出初版。 |
@eddycjy 这周结束之前保证可以出来!💪这个 issue 等初版完成后就更新✌️ |
|
得嘞收到~那我就改起来!💪 |
在 Google Slides 上面可以直接评论。 |
@aofei slides的分享不是公开的,需要请求,考虑设置成公开的? |
我链接点进去有: You need permission Want in? Ask for access, or switch to an account with permission. Learn more |
由于 Slides 加了些提示用的备注,所以暂时给私密了,在今晚分享完后会公开的。 |
以前都是看的视频 今晚前排吃瓜 感谢分享 |
最近梯子被封的比较多,zoom不是被墙了么,你们怎么看的。 |
Slides 的访问权限打开了,可以访问到了。😊 |
我是在提问环节问相关问题的同学,使用go mod获取内部repo的时候会出现问题,具体问题如下:
这里EtcdClient是一个我自己打包的内部repo,然后可以看到这个go get已经找到了这个repo,但是在后面go get的时候它会先去 在这期的夜读中这个问题是由于gitlab本身造成的,然后我找到了一个绕开的办法:
希望对各位有所帮助 |
@gogorush 所以大哥你并不在 Go 夜读的微信群里是吗?我今天早上找到那个我提到的 issue 了,但是我没找到你的联系方式😂。应该是相似的问题,可以去看一下:golang/go#34094 |
在Go 夜读群里面,但是可能不在一个群里面... |
我这么做了,但是还是有问题:
报了这个错误 |
你这个报错已经跟这个问题没关系了 看看你的go.mod文件第15行是什么,是不是goprivate设置问题,试试: 如果不行,试试把mod文件删掉重头配置一下goprivate,goproxy试试。 |
請問一下,go.mod裡面所寫的 go版本號,有實際用途嗎?
我本身環境是go1.13.3 這樣看起來go.mod所標示的版本,沒有實質用途? |
解决了吗, 我也碰到了相同的问题 |
请问下你是怎么解决的,我也遇到相同的问题了 |
你好, 目前升级到go新版本之后已经没有出现这种问题了,并且不用我上述方式,直接将内部repo放入GOPRIVATE就行了 |
go版本升级到1.15.3后又出现同样的问题,而且无法通过以上方法解决。 新的解决办法为:
|
内容简介
Go 1.11 推出的模块(Modules)为 Go 语言开发者打开了一扇新的大门,理想化的依赖管理解决方案使得 Go 语言朝着计算机编程史上的第一个依赖乌托邦(Deptopia)迈进。随着模块一起推出的还有模块代理协议(Module proxy protocol),通过这个协议我们可以实现 Go 模块代理(Go module proxy),aka 依赖镜像。Go 1.13 的发布为模块带来了大量的改进,所以模块的扶正就是这次 Go 1.13 发布中开发者能直接感觉到的最大变化。Go 1.13 中的
GOPROXY
环境变量拥有了一个在中国大陆无法访问到的默认值 proxy.golang.org,经过大家在 golang/go#31755 中激烈的讨论(有些人甚至将话提上升到了“自由世界”的层次),最终 Go 核心团队仍然无法为中国开发者提供一个可在中国大陆访问的官方模块代理。为了今后中国的 Go 语言开发者能更好地进行开发,七牛云推出了非营利性项目 goproxy.cn,其目标是为中国和世界上其他地方的 Gopher 们提供一个免费的、可靠的、持续在线的且经过 CDN 加速的模块代理。可以预见未来是属于模块化的,所以 Go 语言开发者能越早切入模块就能越早进入未来。如果说 Go 1.11 和 Go 1.12 时由于模块的不完善你不愿意切入,那么 Go 1.13 你则可以大胆地开始放心使用。本次分享将讨论如何使用模块和模块代理,以及在它们的使用中会常遇见的坑,还会讲解如何快速搭建自己的私有模块代理,并简单地介绍一下七牛云推出的 goproxy.cn 以及它的出现对于中国 Go 语言开发者来说重要在何处。内容大纲
分享者自我介绍
盛傲飞,两个多月前刚本科毕业,目前刚毕业旅行归来还未找工作,从事 Go 语言开发 4 年左右,开源爱好者,goproxy.cn 的作者。
分享时间
2019-09-26 21:00 UTC+8
分享地址
https://zoom.us/j/6923842137
录播地址
Bilibili(音视频不同步,正在修复……):https://www.bilibili.com/video/av69111199
YouTube:https://youtu.be/H3LVVwZ9zNY
Slides
https://docs.google.com/presentation/d/1LRs_D-IlrSU-ZrJN7KiBhNmCY5tWXH1b2CyDF7jvClY/edit?usp=sharing
参考资料
直播中的文字交流内容
点击展开
直播中的 Q&A 环节内容
问:如何解决 Go 1.13 在从 GitLab 拉取模块版本时遇到的,Go 错误地按照非期望值的路径寻找目标模块版本结果致使最终目标模块拉取失败的问题?
答:GitLab 中配合
go get
而设置的<meta>
存在些许问题,导致 Go 1.13 错误地识别了模块的具体路径,这是个 Bug,据说在 GitLab 的新版本中已经被修复了,详细内容可以看 golang/go#34094 这个 Issue。然后目前的解决办法的话除了升级 GitLab 的版本外,还可以参考 #468 (comment) 这条回复。问:使用 Go modules 时可以同时依赖同一个模块的不同的两个或者多个小版本(修订版本号不同)吗?
答:不可以的,Go modules 只可以同时依赖一个模块的不同的两个或者多个大版本(主版本号不同)。比如可以同时依赖
example.com/[email protected]
和example.com/foobar/[email protected]
,因为他们的模块路径(module path)不同,Go modules 规定主版本号不是v0
或者v1
时,那么主版本号必须显式地出现在模块路径的尾部。但是,同时依赖两个或者多个小版本是不支持的。比如如果模块 A 同时直接依赖了模块 B 和模块 C,且模块 A 直接依赖的是模块 C 的v1.0.0
版本,然后模块 B 直接依赖的是模块 C 的v1.0.1
版本,那么最终 Go modules 会为模块 A 选用模块 C 的v1.0.1
版本而不是模块 A 的go.mod
文件中指明的v1.0.0
版本。这是因为,Go modules 认为只要主版本号不变,那么剩下的都可以直接升级采用最新的。但是如果采用了最新的结果导致项目 Break 掉了,那么 Go modules 就会 Fallback 到上一个老的版本,比如在前面的例子中就会 Fallback 到v1.0.0
版本。问:在
go.sum
文件中的一个模块版本的 Hash 校验数据什么情况下会成对出现,什么情况下只会存在一行?答:通常情况下,在
go.sum
文件中的一个模块版本的 Hash 校验数据会有两行,前一行是该模块的 ZIP 文件的 Hash 校验数据,后一行是该模块的go.mod
文件的 Hash 校验数据。但是也有些情况下只会出现一行该模块的go.mod
文件的 Hash 校验数据,而不包含该模块的 ZIP 文件本身的 Hash 校验数据,这个情况发生在 Go modules 判定为你当前这个项目完全用不到该模块,根本也不会下载该模块的 ZIP 文件,所以就没必要对其作出 Hash 校验保证,只需要对该模块的go.mod
文件作出 Hash 校验保证即可,因为go.mod
文件是用得着的,在深入挖取项目依赖的时候要用。问:能不能更详细地讲解一下
go.mod
文件中的replace
动词的行为以及用法?答:这个
replace
动词的作用是把一个“模块版本”替换为另外一个“模块版本”,这是“模块版本”和“模块版本(module path)”之间的替换,“=>”标识符前面的内容是待替换的“模块版本”的“模块路径”,后面的内容是要替换的目标“模块版本”的所在地,即路径,这个路径可以是一个本地磁盘的相对路径,也可以是一个本地磁盘的绝对路径,还可以是一个网络路径,但是这个目标路径并不会在今后你的项目代码中作为你“导入路径(import path)”出现,代码里的“导入路径”还是得以你替换成的这个目标“模块版本”的“模块路径”作为前缀。注意,Go modules 是不支持在“导入路径”里写相对路径的。举个例子,如果项目 A 依赖了模块 B,比如模块 B 的“模块路径”是example.com/b
,然后它在的磁盘路径是~/b
,在项目 A 里的go.mod
文件中你有一行replace example.com/b => ~/b
,然后在项目 A 里的代码中的“导入路径”就是import "example.com/b"
,而不是import "~/b"
,剩下的工作是 Go modules 帮你自动完成了的。然后就是我在分享中也提到了,exclude
和replace
这两个动词只作用于当前主模块,也就是当前项目,它所依赖的那些其他模块版本中如果出现了你待替换的那个模块版本的话,Go modules 还是会为你依赖的那个模块版本去拉取你的这个待替换的模块版本。比如项目 A 直接依赖了模块 B 和模块 C,然后模块 B 也直接依赖了模块 C,那么你在项目 A 中的go.mod
文件里的replace c => ~/some/path/c
是只会影响项目 A 里写的代码中,而模块 B 所用到的还是你replace
之前的那个c
,并不是你替换成的~/some/path/c
这个。The text was updated successfully, but these errors were encountered: