如何让你的项目同时支持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即可.

如何让你的项目同时支持go vendor和go module的更多相关文章

  1. git项目同时支持多个远端仓库

    git项目同时支持多个远端仓库 为了防止github被墙,最好在国内的托管商做一个备份,这就需要同时提交到多个远端仓库,例如一个open source项目同时要提交csdn和github,url分别是 ...

  2. 利用cocoapods管理开源项目,支持 pod install安装整个流程记录(github公有库)

    利用cocoapods管理开源项目,支持 pod install安装整个流程记录(github公有库),完成预期的任务,大致有下面几步: 1.代码提交到github平台 2.创建.podspec 3. ...

  3. 让现有vue前端项目快速支持多语言 - 用.net core程序快速替换中文为资源Key,咱不干体力活

    前言 最近应公司上层要求,需要将现有项目尽快支持多语言,而中文内容可以找专业人员翻译.那么咱们说干就干,首先我们项目的前端是用vue写的spa程序且组件方面用的element ui,那么自然而然想到用 ...

  4. 修改maven项目jdk版本,并解决Dynamic Web Module 3.1 requires Java 1.7 or newer错误

    使用maven的时候,默认会使用1.5版本的JDK,并且创建项目时也会是1.5版本. 但是我想用JDK1.7版本,所以我手动将maven项目JDK改为1.7版本. 手动修改JDK版本为1.7以后,项目 ...

  5. 让项目同时支持ARC和非ARC

    ttp://code4app.com/snippets/one/禁止某几个文件用ARC模式编译/502344256803fa246d000000#s0 如果你的绝大部分代码需要ARC,那么就设置项目支 ...

  6. babel配置项目目录支持转换es6语法,引入非项目目录js后,引入Js转换无效

    我遇到了一个问题,我在已经配置babel的项目中通过require引入了一个项目目录外层的另一个js文件,前期是可以成功转换并打包的,但是到了后期就不行了,报错: 这个报错的意思是,引入的js文件中有 ...

  7. 让ios项目同时支持ARC和非ARC

    ttp://code4app.com/snippets/one/禁止某几个文件用ARC模式编译/502344256803fa246d000000#s0 如果你的绝大部分代码需要ARC,那么就设置项目支 ...

  8. tomcat发布web项目,支持域名

    首先需要安装JDK,不是Linux自带的OpenJDK,参考下面的文章: centos下 安装jdk 设置java环境变量:编辑这个/etc/profile文件: export JAVA_HOME=/ ...

  9. Eclipse对于多个Java项目的支持并不友好!

    本文吐槽! 如果我们创建两个Java项目.一个叫StatsReader.把数据从网上下载到本地数据库里.一个叫StatsViewer.把数据从数据库里拿出来呈现给用户.这两个项目都要用同一个外部类库m ...

随机推荐

  1. 765. Couples Holding Hands

    ▶ n 对夫妻共 2n 个人随机坐成一排,“交换其中某两人的位置” 称为一次操作,求最少的操作此次数,使 n 对夫妻两人都相邻.初始座位为非负整数列 D1n-1,其中值为 2k 和 2k+1 的两个元 ...

  2. oracle ROW_NUMBER用法

    Oracle中row_number().rank().dense_rank() 的区别 row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复 使 ...

  3. netbeans php环境搭建

    jdk必须: sudo apt-get install openjdk-7-jdk

  4. 问题记录,StartCoroutine(“str")问题

    StartCoroutine参数为函数字符串名,运行时出错,错误是:无法启动协程函数. 调用格式如下: gameManager.StartCoroutine(LuaOnLevelwasloaded() ...

  5. ColorMask

    [ColorMask] When using multiple render target (MRT) rendering, it is possible to set up different co ...

  6. Cocoa Touch(六):App运行机制 NSRunLoop, KVC, KVO, Notification, ARC

    事件循环NSRunLoop 1.run loop概念 NSRunLoop类封装了线程进入事件循环的过程,一个runloop实例就表示了一个线程的事件循环.更具体的说,在iOS开发框架中,线程每次执行完 ...

  7. unity平行光太亮?物体发白?可能你使用了2个或多个平行光

    unity平行光太亮?物体发白?可能你使用了2个或多个平行光 今天做项目时就遇到了这个问题,光亮得让物体发白 发现加载的场景 里面有个 平行光,删了就好了 要是感觉还是太亮,就把主平行光的Intens ...

  8. maven标签说明

    <project xmlns="http://maven.apache.org/POM/4.0.0 " xmlns:xsi="http://www.w3.org/2 ...

  9. sqlserver2014新特性

    1.SQL Server 2014新特性探秘(1)-内存数据库 在传统的数据库表中,由于磁盘的物理结构限制,表和索引的结构为B-Tree,这就使得该类索引在大并发的OLTP环境中显得非常乏力,虽然有很 ...

  10. [Jenkins]怎样在Jenkins上面启动服务器上的批处理脚本

    New Item 在Build --> Execute Windows batch command --> 里面填写: schtasks /run /tn Start_Hub_szotqa ...