如何让你的项目同时支持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. Xshell连接虚拟机突然被拒,提示再次输入密码。。。

    sudo vim /etc/ssh/sshd_config 将 # Authentication: LoginGraceTime 120 PermitRootLogin prohibit-passwo ...

  2. maven学习系列 之 常见问题

    1.新建的maven项目无法修改 Project Facets 的 Dynamic Web Module 版本 RE: 在工程目录下有一个.settings文件夹,打开org.eclipse.wst. ...

  3. DB2 数据类型转换

    db2数据类型转换: 1.CAST() CAST (<expression> AS <data_ type>[ length ]) 2.CONVERT() CONVERT (& ...

  4. Linux 移除python Error: Trying to remove “yum”, which is protected

    >yum intall python >yum -y remove python 出现Error: Trying to remove "yum", which is p ...

  5. Spring Cloud Config配置中心的使用

    一.概述 1. 为什么使用? 1> 配置文件太多,不方便维护 2> 配置文件一般都保存这各种明文显示的密码,无法保证配置内容的安全性,也无法做到按权限分配给个人 3> 更新配置项目需 ...

  6. Redis RDB文件

    [Redis RDB文件] 1.RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). RDB 的优点 RDB 是一个非常紧凑(compact)的 ...

  7. Emacs中编辑保存makefile文件时会错误地将TAB转成空格的解决方法

    问题描述 我的Emacs使用了Purcell的配置,在其配置中使用了whitespace-cleanup,且通过在.emacs.d/lisp/init-edit-utils.el中设定: (requi ...

  8. Vue.js基础知识

    <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml&q ...

  9. ramfs和tmpfs的区别

    简介 ramfs和tmpfs是在内存上建立的文件系统(Filesystem).其优点是读写速度很快,但存在掉电丢失的风险.如果一个进程的性能瓶颈是硬盘的读写,那么可以考虑在ramfs或tmpfs上进行 ...

  10. IntelliJ IDEA 2017版开发SpringBoot之fastJsonHttpMessageConvert使用

    继承WebMvcConfigurerAdapter,改写成自己的json转换工具的写法 1.建立实体类 package com.fastjson; import com.alibaba.fastjso ...