在go modules中使用replace替换无法直接获取的package(golang.org/x/...)

上一篇里我们介绍了使用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的步骤应该是这样的:

  1. 首先go get new-package(如果你知道package的版本tag,那么这一步其实可以省略,如果想使用最新的版本而不想确认版本号,则需要这一步)
  2. 然后查看go.mod,手动复制new-package的版本号(如果你知道版本号,则跳过,这一步十分得不人性化,也许以后会改进)
  3. 接着go mod tidy或者go build或者使用其他的go tools,他们会去获取new-package然后替换掉old-package
  4. 最后,在你的代码里直接使用old-package的名字,golang会自动识别出replace,然后实际你的程序将会使用new-package,替换成功

下面我们仍然用chromedp的example做一个示例。

示例

chromedp使用了golang.org/x/image,这个package一般直连是获取不了的,但是它有一个github.com/golang/image的镜像,所以我们要用replace来用镜像替换它。

我们先来看看如果不replace的情况下的依赖情况:

没错,我们使用了原来的包,当然如果你无法获取到它的话是不会被记录进来的。

下面我们go get它的镜像:

# master表示获取最新的commitgo get github.com/golang/[email protected]

然后我们查看版本号:

cat go.mod

有了版本号,我们就能replace了:

go mod edit -replace=golang.org/x/[email protected]0.0-20180708004352-c73c2afc3b81=github.com/golang/[email protected]0.0-20180708004352-c73c2afc3b81

现在我们查看一下go.mod:

replace信息已经更新了,现在我们只要go mod tidy或者go build,我们的代码就可以使用new-package了。

更新后的go.sum,依赖已经替换成了镜像:

目前来看,replace做的远不如go get那样方便人性化,不过毕竟还只是测试阶段的功能,期待一下它在go1.12的表现吧。

如果有错误和疑问,欢迎在评论指出,也感谢@goozp提出的问题。

原文地址:https://www.cnblogs.com/apocelipes/p/9609895.html

时间: 2024-10-14 01:05:26

在go modules中使用replace替换无法直接获取的package(golang.org/x/...)的相关文章

JS使用replace替换字符串中的某段或某个字符

函数的介绍参考:http://www.w3school.com.cn/jsref/jsref_replace.asp 下列代码将Hello World!中的World替换为Jim <html> <body> <script type="text/javascript"> var str="Hello World!" document.write(str.replace("World","Jim&quo

JavaScript 中的 replace 方法

定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. stringObject.replace(regexp/substr,replacement) 参数 描述 regexp/substr 必需.规定子字符串或要替换的模式的 RegExp 对象. 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象. replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数. 返回值

【小贴士】探一探javascript中的replace

javascript字符串与数组有很多精巧的方法,比如splice.indexOf,而replace在字符串处理中偶尔会产生让人愉悦的效果 比如underscore中的模板引擎替换部分,又如信用卡分割的应用 简单来说,replace用于将字符串中一些字符替换为另一些字符,最简单的情况如下 var num = '1234567890123456'; var numStr = ''; numStr = num.replace('1', 'a'); console.log(numStr);//a234

深入理解 JavaScript 中的 replace 方法(转)

replace方法是属于String对象的,可用于替换字符串. 简单介绍: StringObject.replace(searchValue,replaceValue) StringObject:字符串 searchValue:字符串或正则表达式 replaceValue:字符串或者函数 字符串替换字符串 JavaScript 1 'I am loser!'.replace('loser','hero')//I am hero! 直接使用字符串能让自己从loser变成hero,但是如果有2个lo

Aspose.Words使用教程之在文档中找到并替换文本

Aspose.Words使用教程之在文档中找到并替换文本 Aspose.Words是一款先进的文档处理控件,在不使用Microsoft Words的情况下,它可以使用户在各个应用程序中执行各种文档处理任务,其中包括文档的生成.修改.渲染.打印,文档格式转换和邮件合并等文档处理.此外,Aspose.Words支持DOC,OOXML,RTF,HTML,OpenDocument, PDF, XPS, EPUB和其他格式. 使用范围:在前的范围内替换查找或替换特定的字符串,因为它会返回替换的数量,所以它

word 文档操作类,可以读出word中书签 批量替换内容,直接调用

using System;using System.Collections.Generic;using System.Text;using Word = Microsoft.Office.Interop.Word; namespace ELO.BLL{ /* * Description:用于Word基本操作类 */public partial class Helper_Word { #region 私有成员 private Word.ApplicationClass _wordApplicati

在javascript中使用replace

javascript中使用replace功能很强大,不仅可以替换为字符串,还可以利用正则表达式,对匹配到的字符串为所欲为的进行操作,首先我们来了解一下replace的基本语法 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp/substr,replacement)  返回值 一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的

js正则表达式/replace替换变量方法

转自:http://www.blogjava.net/pingpang/archive/2012/08/12/385342.html 1. javascript 正则对象替换创建和用法:/pattern/flags 先简单案例学习认识下replace能干什么: 正则表达式构造函数: new RegExp("pattern"[,"flags"]); 正则表达式替换变量函数:stringObj.replace(RegExp,replace Text);参数说明:patt

JS中的replace方法

JavaScript中replace() 方法如果直接用str.replace("-","!") 只会替换第一个匹配的字符. 而str.replace(/\-/g,"!")则可以全部替换掉匹配的字符(g为全局标志). 所以可以用以下几种方式.:string.replace(/reallyDo/g, replaceWith);string.replace(new RegExp(reallyDo, 'g'), replaceWith); string