参考文章

学习Golang之后对golang中的版本管理,包管理等机制一直没有很好的琢磨,偶然想起还是觉得很有必要进行归纳,包管理使用起来简单,无非就是installuninstalllist等,但是在工程上包管理要是不当,却会造成很多不必要的麻烦。

gvm

gvm是golang的版本管理程序,为什么需要这么个版本管理,是因为golang还在高速发展中,发版频繁,升级迭代可能不完全兼容上一代,所以这种工具应运而生,像ruby有对应的rvm,node有对应的nvm都是为了方便的进行不同版本的切换。

install

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

安装完,验证一下是否安装成功

gvm version

输出

Go Version Manager v1.0.22 installed at /Users/liujb/.gvm

支持的命令

% gvm
Usage: gvm [command] Description:
GVM is the Go Version Manager Commands:
version - print the gvm version number
get - gets the latest code (for debugging)
use - select a go version to use
diff - view changes to Go root
implode - completely remove gvm
install - install go versions
uninstall - uninstall go versions
cross - install go cross compilers
linkthis - link this directory into GOPATH
list - list installed go versions
listall - list available versions
alias - manage go version aliases
pkgset - manage go packages sets
pkgenv - edit the environment for a package set

常见的命令

  1. gvm listall 查看所有的golang版本
  2. gvm install go1.4.2 安装1.4.2版本
  3. gvm use go1.4.2 使用go1.4.2版本,使用后GOPATH变成/Users/liujb/.gvm/pkgsets/go1.4.2/global,这样就相当于每个版本的golang所使用的GOPATH都不一样,这样不同的golang包之间的版本兼容问题也可以得到解决。

gvp/gpm

install

brew install gvp
brew install gpm

use

这两个包一般成对使用,其中gvp命令使用主要设置GOPATH为当前目录,例如

source gvp
echo $GOPATH # 输出/Users/liujb/.godeps:/Users/liujb

gpm主要是通过install命令安装Godeps文件内指定的包,最主要的两个命令

$ gpm get         # Parses the Godeps file, gets dependencies and sets them
# to the appropriate version but does not install them.
$ gpm install # Parses the Godeps file, installs dependencies and sets

Godeps的文件类似

github.com/nu7hatch/gotrail               v0.0.2
github.com/replicon/fast-archiver v1.02
launchpad.net/gocheck r2013.03.03 # Bazaar repositories are supported
code.google.com/p/go.example/hello/... ae081cd1d6cc # And so are Mercurial ones

通过gpm install时候会先解析Godeps文件,然后安装文件内指定的包以及版本,同时安装到.godeps目录下的src/bin/pkg

godep

install

go get github.com/tools/godep
或者
brew install godep

使用

参考1 参考2

在项目的根目录下,执行两个命令,其中需要安装的包需要先使用go get下载到$GOPATH下边,另外所在项目需要在版本管理githg 之下。

godep save
godep restore
Godeps.json的文件格式如下
{
"ImportPath": "github.com/kr/hk",
"GoVersion": "go1.1.2",
"Deps": [
{
"ImportPath": "code.google.com/p/go-netrc/netrc",
"Rev": "28676070ab99"
},
{
"ImportPath": "github.com/kr/binarydist",
"Rev": "3380ade90f8b0dfa3e363fd7d7e941fa857d0d13"
}
]
}

gom

install

go get github.com/mattn/gom

use

创建Gomfiles

gom 'github.com/mattn/go-runewidth', :tag => 'go1'
gom 'github.com/mattn/go-scan', :commit => 'ecb144fb1f2848a24ebfdadf8e64380406d87206'
gom 'github.com/daviddengcn/go-colortext'
gom 'github.com/mattn/go-ole', :goos => 'windows' # Execute only in the "test" environment.
group :test do
gom 'github.com/mattn/go-sqlite3'
end # Execute only for the "custom_group" group.
group :custom_group do
gom 'github.com/golang/lint/golint'
end

执行

gom install

然后会在项目下创建_vendor目录。

% tree -L 4
├── Gomfile
└── _vendor
└── src
└── github.com
├── daviddengcn
└── mattn 5 directories, 1 file

个人小结

  1. gvm说白了是golang的版本管理,跟包管理没有半毛钱关系
  2. gvp/gpm这一配套工具,可以设置当前目录为GOPATH,同时根据Godeps文件的描述,安装指定的包到gvp指定的路径。
  3. godep说白了,就是将通过go get安装的包,通过json文件Godeps.json保存到项目下的Godeps/_workspace目录下,然后编译的时候export GOPATH='Project/Godeps/_workspace':$GOPATH即可。
  4. gomnpm最接近,都只是需要一个包描述文件,然后安装到指定位置,其余什么都不用做了,当然别忘了指定GOPATH

对golang中包的管理机制大概讲这么多,有问题一起沟通。引用注明出处即可。

Golang-and-package-version-managment的更多相关文章

  1. golang (2) package

    综述 golang package是基本的管理单元,package是golang最基本的分发单位和工程管理中依赖关系的体现. 每个golang源代码文件开头都拥有一个package声明,表示该gola ...

  2. golang的哪些坑爷事: package实践

    在golang中package是个困惑的概念, 特别是package还可以与folder不同名, 委实让我恶心了一把. 关于golang的package的最佳实践: package is folder ...

  3. [工作积累] NDK通过Java获取package name 和version

    ////////////////////////////////////////////////////////////////////////// //Java code snippet //get ...

  4. 关于golang中包(package)的二三事儿

    golang的package和其他语言的组织方式完全不同,刚开始接触时,很不适应. golang的package的特点: 1.go的package不局限于一个文件,可以由多个文件组成. 组成一个pac ...

  5. golang在Windows下Sublime Text开发调试环境的配置

    一.前言 近期本人有工作调动,进入了一个全新的领域[golang]服务端开发.在此写下本文,希望给那些没接触过golang开发调试环境及还在犹豫选择那家golang IDE而纠结的朋友们一点点帮助,如 ...

  6. PHP和Golang使用Thrift1和Thrift2访问Hbase0.96.2(ubuntu12.04)

    目录: 一.Thrift1和Thrift2的简要介绍 1) 写在前面 2) Thrift1和Thrift2的区别  二.Thrift0.9.2的安装 1) 安装依赖插件 2) Thrift0.9.2的 ...

  7. Golang学习--包管理工具glide

    上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依 ...

  8. C/C++调用Golang 一

    C/C++调用Golang 一 (开发环境: 操作系统: windows 7 32位操作系统 C++: visual studio 2010 Golang:go version go1.9 windo ...

  9. Golang Go Go Go part1:安装及运行

    golang 知识图谱 https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0 一.安装 最新版本安装包地址:https://gola ...

  10. 6行代码解决golang TCP粘包

    转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现 ...

随机推荐

  1. ibatis的批处理

    (1)spring模式:尽管spring已经配置了事务,但以下代码中还是要设置事务,不然batch不会起作用;另外这里虽然设了一下事务处理,但对全局事务并不会造成影响;注:不启用事务将建立多次连接,这 ...

  2. Apache 做反向代理服务器

    apache做反向代理服务器 apache代理分为正向代理和反向代理: 1 正向代理: 客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web ...

  3. coalesce函数-返回参数中第一个非null值

    coalesce函数-返回参数中第一个非null值 学习了:http://www.cnblogs.com/zc_0101/archive/2009/08/11/1543650.html 这个要复杂一些 ...

  4. VMWare虚拟机下为Ubuntu 12.04.1网络设置(NAT方式)

    NAT方式: 虚拟机能够上外网,能够訪问宿主计算机所在网络的其它计算机(反之不行). 第一步:设置虚拟机vmware网络參数 (1)打开虚拟机,选择菜单"编辑">" ...

  5. Android 自己定义View学习(2)

    上一篇学习了基本使用方法,今天学一下略微复杂一点的.先看一下效果图 为了完毕上面的效果还是要用到上一期开头的四步 1,属性应该要有颜色,要有速度 <?xml version="1.0& ...

  6. 微软ASP.NET网站部署指南(9):部署数据库更新

    1.  综述 无论什么时候,程序都有可能像代码更新一样更新数据库.本章节你将进行数据库改动,測试.然后部署到測试环境和生产环境. 提醒:假设依据本章节所做的操作出现错误信息或一些功能不正常的话,请务必 ...

  7. gridview in webform

    How to: Enable Default Paging in the GridView Web Server Control https://msdn.microsoft.com/en-us/li ...

  8. 2017-3-5 leetcode 442 531 533

    今天莫名其妙睡到了中午,很难受... leetcode442 https://leetcode.com/problems/find-all-duplicates-in-an-array/?tab=De ...

  9. USACO 1.4 Arithmetic Progressions

    Arithmetic Progressions An arithmetic progression is a sequence of the form a, a+b, a+2b, ..., a+nb ...

  10. Java-MyBatis-杂项:MyBatis根据数组、集合查询

    ylbtech-Java-MyBatis-杂项:MyBatis根据数组.集合查询 1.返回顶部 1. foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的 ...