初次开发构建Go项目的朋友可能对如果创建一个干净独立的项目环境有些疑惑,这里介绍一下个人经验。

前提

  1. 你安装配置好了golang编译器
  2. 你懂得配置GOPATH,了解GO开发环境的目录结构

主要问题及解决手段概述

  1. 隔离的开发环境。通过覆盖GOPATH环境变量解决。
  2. 三方依赖库的项目隔离。通过vendor机制。
  3. 三方库版本依赖。通过govendor工具。
  4. 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