zoukankan      html  css  js  c++  java
  • go modules中使用replace用法

    因为某些未知原因,并不是所有的包都能直接用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表示获取最新的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的表现吧。

  • 相关阅读:
    springboot 无法访问静态资源
    webrtc源码阅读理解一
    c++ include的顺序重要吗?
    简说yuv
    i420 转 nv21
    ffmpeg mp4 转 yuv、 y4m转yuv、mp4转y4m && ffplay 播放y4m、yuv
    mysql 查询json字符串条件
    Webpack4.X中sourcemap的配置 详解
    webpack如何打包生成的map文件不生效?
    vue中使用setInterval,移入暂停,移出继续
  • 原文地址:https://www.cnblogs.com/sunsky303/p/12150575.html
Copyright © 2011-2022 走看看