初次开发构建Go项目的朋友可能对如果创建一个干净独立的项目环境有些疑惑,这里介绍一下个人经验。
前提
- 你安装配置好了golang编译器
- 你懂得配置GOPATH,了解GO开发环境的目录结构
主要问题及解决手段概述
- 隔离的开发环境。通过覆盖GOPATH环境变量解决。
- 三方依赖库的项目隔离。通过vendor机制。
- 三方库版本依赖。通过govendor工具。
- golang.org/ 包不能直接go get的问题。通过github镜像解决。
步骤
工具安装
govendor
具体使用方法见项目主页:https://github.com/kardianos/govendor
安装:
go get -u github.com/kardianos/govendor
该命令会将govender安装在你默认配置的的\$GOPATH/bin目录下,通常你已经将这个目录配置到了环境变量PATH中。
从一个实例开始
已有的所有项目地址:http://git.emoney.cn/monitor/monitorplat.git 代码包导入路径:MonitorPlat/oneagent, MonitorPlat/onedistribute, … (该项目由多个程序组成)
创建目录结构
mkdir -p dev_projects/src/MonitorPlat
迁出代码
cd dev_projects
git clone http://git.emoney.cn/monitor/monitorplat.git src/MonitorPlat
环境隔离
为了和.bashrc中配置的\$GOPATH隔离,需要在dev_projects下运行:
export GOPATH=$(pwd)
为了使用方便,可以写两个脚本
env_activate.sh
CURDIR=`pwd`
OLDGOPATH="$GOPATH"
export GOPATH="$CURDIR"
env_deactivate.sh
export GOPATH=$OLDGOPATH
这样你可以通过
source env_activate.sh
和
source env_deactivate.sh
来切换
vendor 初始化
cd src/MonitorPlat
govendor init
从github镜像获取golang.org依赖包
首先可以在Monitor目录下用命令看到项目所有依赖包
govendor list
...
m golang.org/x/net/context
m golang.org/x/net/context/ctxhttp
m golang.org/x/net/websocket
m golang.org/x/text/cases
m golang.org/x/text/encoding
m golang.org/x/text/encoding/charmap
m golang.org/x/text/encoding/internal
m golang.org/x/text/encoding/internal/enctest
m golang.org/x/text/encoding/internal/identifier
m golang.org/x/text/encoding/simplifiedchinese
m golang.org/x/text/encoding/unicode
m golang.org/x/text/internal
m golang.org/x/text/internal/gen
m golang.org/x/text/internal/language
m golang.org/x/text/internal/language/compact
m golang.org/x/text/internal/tag
m golang.org/x/text/internal/testtext
m golang.org/x/text/internal/ucd
m golang.org/x/text/internal/utf8internal
m golang.org/x/text/language
m golang.org/x/text/runes
m golang.org/x/text/transform
m golang.org/x/text/unicode/cldr
m golang.org/x/text/unicode/norm
m golang.org/x/text/unicode/rangetable
m golang.org/x/text/width
m github.com/devfeel/dottask
m github.com/devfeel/dotweb
m github.com/devfeel/dotweb/cache
m github.com/devfeel/dotweb/cache/redis
m github.com/devfeel/dotweb/cache/runtime
m github.com/devfeel/dotweb/config
m github.com/devfeel/dotweb/const
m github.com/devfeel/dotweb/core
m github.com/devfeel/dotweb/feature
m github.com/devfeel/dotweb/framework/convert
m github.com/devfeel/dotweb/framework/crypto
m github.com/devfeel/dotweb/framework/crypto/uuid
m github.com/devfeel/dotweb/framework/encodes/gob
m github.com/devfeel/dotweb/framework/exception
m github.com/devfeel/dotweb/framework/file
m github.com/devfeel/dotweb/framework/json
m github.com/devfeel/dotweb/framework/redis
m github.com/devfeel/dotweb/framework/reflects
m github.com/devfeel/dotweb/logger
m github.com/devfeel/dotweb/servers
m github.com/devfeel/dotweb/session
m github.com/devfeel/dotweb/test
m github.com/garyburd/redigo/internal
m github.com/garyburd/redigo/redis
m github.com/influxdata/influxdb/client/v2
m github.com/influxdata/influxdb/models
m github.com/influxdata/influxdb/pkg/escape
其中行首 m 标识的,是目前环境缺少的包。从 golang.org 的依赖主要是 x/net 和 x/text 两部分。
vendor 目录中创建 golang.org/x 目录
mkdir -p vendor/golang.org/x
项目子模块添加
git submodule add https://github.com/golang/net.git vendor/golang.org/x/net
git submodule add https://github.com/golang/text.git vendor/golang.org/x/text
获取其他依赖包
可以简单的通过一个命令
govendor fetch +m
git 追踪
git add vendor/vendor.json
git commit ...
git push ...
新位置使用
git submodule 已经把vendor/golang.org 下的项目版本记住 其他的包,vendor.json 记录了版本。
commit 并提交到远程库后,在新的位置迁出后
export GOPATH=$(pwd)
cd src/MonitorPlat
git submodule update
govender sync
Comments
comments powered by Disqus