在go modules中使用replace替换无法直接获取的package(golang.org/x/...)
2018-09-08 17:52
1216 查看
上一篇里我们介绍了使用go get进行包管理。
不过因为某些未知原因,并不是所有的包都能直接用go get获取到,这时我们就需要使用go modules的replace功能了。(当然大部分问题挂个梯子就能解决,但是我们也可以有其它选项)
使用replace替换package
replace顾名思义,就是用新的package去替换另一个package,他们可以是不同的package,也可以是同一个package的不同版本。看一下基本的语法:
go mod edit -replace=old[@v]=new[@v]
old是要被替换的package,new就是用于替换的package。
这里有几点要注意:
- replace应该在引入新的依赖后立即执行,以免go tools自动更新mod文件时使用了old package导致可能的失败
- package后面的version不可省略。(edit所有操作都需要版本tag)
- version不能是master或者latest,这两者go get可用,但是go mod edit不可识别,会报错。(不知道是不是bug,虽然文档里表示可以这么用,希望go1.12能做点完善措施)
基于以上原因,我们替换一个package的步骤应该是这样的:
- 首先go get new-package(如果你知道package的版本tag,那么这一步其实可以省略,如果想使用最新的版本而不想确认版本号,则需要这一步)
- 然后查看go.mod,手动复制new-package的版本号(如果你知道版本号,则跳过,这一步十分得不人性化,也许以后会改进)
- 接着go mod tidy或者go build或者使用其他的go tools,他们会去获取new-package然后替换掉old-package
- 最后,在你的代码里直接使用old-package的名字,golang会自动识别出replace,然后实际你的程序将会使用new-package,替换成功
下面我们仍然用chromedp的example做一个示例。
示例
chromedp使用了golang.org/x/image,这个package一般直连是获取不了的,但是它有一个github.com/golang/image的镜像,所以我们要用replace来用镜像替换它。
我们先来看看如果不replace的情况下的依赖情况:
没错,我们使用了原来的包,当然如果你无法获取到它的话是不会被记录进来的。
下面我们go get它的镜像:
# master表示获取最新的commit
go get github.com/golang/image@master
然后我们查看版本号:
cat go.mod
有了版本号,我们就能replace了:
go mod edit -replace=golang.org/x/image@v0.0.0-20180708004352-c73c2afc3b81=github.com/golang/image@v0.0.0-20180708004352-c73c2afc3b81
现在我们查看一下go.mod:
replace信息已经更新了,现在我们只要go mod tidy或者go build,我们的代码就可以使用new-package了。
更新后的go.sum,依赖已经替换成了镜像:
目前来看,replace做的远不如go get那样方便人性化,不过毕竟还只是测试阶段的功能,期待一下它在go1.12的表现吧。
如果有错误和疑问,欢迎在评论指出,也感谢@goozp提出的问题。
相关文章推荐
- Android studio apk直接发送到手机无法使用的问题及扩展/apk签名/SHA1的获取
- selenium又一小坑 无法用XPATH直接获取属性值 需要使用.get_attribute(“href”)
- 使用Struts2-tags的include,所带参数无法通过ongl直接获取的问题
- Go实战--golang中使用echo框架中的HTTP/2、Server Push(labstack/echo、golang.org/x/net/http2)
- 无坑安装使用godep(golang.org/x/tools/go/vcs的错误解决方案)
- SpringMVC 使用uploadify插件上传文件,post方法无法直接获取参数问题
- Go实战--golang中使用gRPC和Protobuf实现高性能api(golang/protobuf、google.golang.org/grpc)
- 在类别无法直接使用的一些对象或方法
- 使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
- 使用webcam 直接从内存获取图像 非读取ClipBoard或者File.
- 有关使用 GPS Intermediate Driver 无法获取到GPS数据的一个问题
- 有关使用 GPS Intermediate Driver 无法获取到GPS数据的一个问题
- 通用对话框中的查找/替换对话框CFindReplaceDialog在WTL中的使用
- 正常获取IPV6地址却无法使用的解决方案
- VC中ADO使用SQLOLEDB数据驱动时,无法获取存储过程RAISERROR返回的字符串描述
- VS2010中使用正则表达式替换时无法使用回车符的解决方法
- 使用sys.SQL_Modules获取SQL Server数据库对象(存储过程,视图,函数)定义脚本
- 当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件
- 关于使用jspSmartUpload控件无法获取表单数据
- dropdownlist无法使用dropdownlist1.Items[dropdownlist1.SelectedIndex]来获取回传的值的原因