• 如何让你的项目同时支持go vendor和go module


    如何让你的项目同时支持go vendor和go module

    1. go module简介

    go module是go在1.11版本引入的新的版本依赖工具,是对vendor方式的一次升级. 目前是如果项目位于GOPATH下则会默认禁用go modoule,否则就会默认启用.

    因此首先需要将项目移出GOPATH,假设位于~/dev/smmodule目录下.

    2. 使用go mod命令管理项目

    这里以我们的Photon项目为例,来说明如何实施.

    2.1 初始化环境

    cd ~/dev/smmodule/Photon 切换到项目以后首先要初始化.为了避免带来莫名其妙的问题,建议先将vendor目录移到其他地方,待配置完毕以后再移回来.

    cd ~/dev/smmodule/Photon
    go mod init
    

    这时就会在Photon下产生了go.mod 文件,如果打开就会看到只有一句话

    module github.com/nkbai/Photon
    

    这个路径是因为我这个项目在github上的路径是 github.com/nkbai/Photon ,但是实际上,我这个项目只是module github.com/SmartMeshFoundation/Photon ,所以需要直接将其内容修改为

    module github.com/SmartMeshFoundation/Photon
    

    2.2 构建

    这时候我们进入cmd/photon目录,执行go build命令,进行编译.这时候就会看到go会根据项目代码自动下载所有依赖的项目代码. 这个过程可能会碰到各种问题.下面就常见的问题列出来.

    2.2.1 需要翻墙的源码怎么办?

    直接打开go.mod 添加replace项,
    比如:

    replace (
    	golang.org/x/net v0.0.0-20181106171534-e4dc69e5b2fd => github.com/golang/net latest
    )
    
    

    这表示系统依赖的 golang.org/x/net v0.0.0 这个版本应该从github.com/golang/net 这个地方下载latest也就是最新版本.

    2.2.2 我依赖的不能是最新的代码怎么办

    我们的项目以前用的是vendor方式,可能依赖的是某个项目较早的版本,但是go下载的确实最新的版本,这时候只需到项目主页找到你依赖的版本号即可.

    比如Photon依赖的storm,go自动下载的是最新的2.1.2,但是无法编译.
    这时候就需要打开go.mod 直接修改
    比如我这里直接将
    github.com/asdine/storm v2.1.2+incompatible 修改为v2.1.1

    这样就可以正常编译了.

    2.2.3 我依赖的某个项目是我修改过的,和官方版本不一样怎么办

    比如Photon依赖的go-ethereum实际上不是官方的任何一个版本,是根据我们自己的需要,做了修改的版本. 那么这时候也很简单,直接clone一个官方的版本到自己的github上,然后修改. 待修改完毕以后,新建一个版本即可.

    比如我就把 github.com/ethereum/go-ethereum clone到我自己的github上,然后按照vendor中的修改重新来一遍,然后打了一个v1.9.1的tag.

    然后同样replace成下面的.
    replace (
    github.com/ethereum/go-ethereum v1.8.17 => github.com/nkbai/go-ethereum v1.9.1
    )

    2.2.4 其他注意事项

    由于go mod目前处于较早起版本,我们手工修改文件要特别注意 否则会碰到莫名其妙的问题.我说一下我碰到的两个问题

      1. replace和(之间的空格一定不能少
      1. => 前后的空格一定不能少
      1. 如果替换的版本号不知道是多少,直接写latest,go会自己找到最新版本填上去.

    3. 保持兼容性

    将原来的vendor目录移回来,这时候你会发现项目没什么变化,只是多了两个go.mod和go.sum两个文件,直接添加将其提交到github即可.

    这时候,你这个项目既可以在GOPATH下像以前一样管理,也可以在独立的其他目录中编译运行.

    4. 使用goland来管理你的新版项目

    记得新建项目,并且在新建的时候选择go module即可.

  • 相关阅读:
    外观模式
    装饰器模式
    eclipse在运行main方法时在console里面报内存溢出的错误解决办法
    windows7安装node
    Eclipse-低版本离线集成svn步骤
    IDEA-JetBrains产品永久破解
    Java对字符串使用MD5进行加密(亲测有效)
    windows下的java项目打jar分别编写在windows与linux下运行的脚本( 本人亲测可用!)
    在linux中运行main方法所在的java类(亲测有效!!!)
    linux常用命令
  • 原文地址:https://www.cnblogs.com/baizx/p/9925509.html
Copyright © 2020-2023  润新知