本文介绍Golang的工程管理。

工程概述

GOPATH目录下创建三个目录:

  • src 存放源代码,每个工程一个单独的目录
  • pkg 编译过后生成的包文件存放目录,根据平台有不同目录,里面有许多.a库,暂未研究。
  • bin 编译后生产的可执行文件和go相关的工具

工程管理

golang 查找依赖包路径:
当前目录下的vendor目录。
向上级目录查找,直到找到src下的vendor目录。
在 GOPATH 下面查找依赖包。
在 GOROOT 目录下查找。

依赖包有几大各类:

github.com:位于 github.com 上的仓库。
golang.org:golang官方包
gopkg.in:
google.golang.org:
k8s.io:k8s相关的

(理论上可创建自定义的名称,不一定要存在,但无法用 go get 获取。)

笔记三

根据实际情况和路径,在 src 先创建目录。可不按 github.com 之类。说明:
许多开源项目托管于 github.com 上,且依赖其它同样托管在 github 的项目。因此要在 src 下创建 github.com 目录,如 kubeedge 项目,其路径为:github.com\kubeedge\kubeedge 。cobra 项目路径 为 github.com\spf13\cobra,等等。
k8s 项目使用的路径为 k8s.io/kubernetes 。这些路径,一般规定好,写到官方文档。
内部项目,可自定义路径目录,只要与源码保持一致即可。
项目依赖的包,放到项目的 vendor 中,随项目托管。

笔记二

针对第三方依赖包的讨论:
对于小工具或测试模块,不同模块,可能使用同一依赖包,故将依赖包下载到 src 目录,以便共用。事实上,依赖包大目录基本为上述几个,大目录不会杂乱。
对于大工程和项目,可将依赖包纳入版本管理,也可不纳入。前者仓库体积可能变大,但方便使用,无须再下载依赖包。后者仓库体积小,但需要使用者额外下载,有可能无法成功下载依赖包。此为矛盾之处。二者均可,取决于团队决策。个人偏向将依赖包进行版本管理,虽然体积大,但“开箱即用”,减少后来者工作。

笔记一

不同的包,单独成目录,放到src目录。将GOPATH放到大的版本管理。如本地测试文件,可不提交管理。
对于可公开的库,直接提交到的github.com上,在单独目录做测试(可直接运行的)。
在src新建foo目录,foo有main.go,另有vendor子目录,vendor有uitls目录,即为utils包,实现模块。在main.go中引用utils包即可。

我的golang工程:为方便编写代码,而不显得目录混乱,又能与其它工程区别开。新建 go_test 项目目录,其下有vendor子目录,vendor 即为该项目所依赖的自编模块(注:外部依赖不在此列),其下可有各个模块,如utils目录,即为utils包,目录下文件名可不同,实现函数不同,但均属于 utils 包。同时,vendor有mybuff、mylog等包(目录)。由于部分功能可能与第三方库相同,可添加my为前缀,以示区别。

该目录放到任意目录均可。这样,go_test 工程可单独使用,同理,还有其它工程。

再注:
公司项目根目录只能位于GOPATH,其下bin/pkg/src目录,还有readme和其它配置文件。src有自编模块(目录),也有github.com golang.org gopkg.in(但这些放到.gitignore忽略了)。为与公司兼容,将自己的测试工程放到src下的vendor中,再将vendor忽略。

工程目录概述

参考这里 的说明。

go mod 使用

go mod init  // 创建go.mod文件后可用go build直接编译,如果不存在的包,会自动下载(测试了github.com等地址),下载地址为GOPATH/pkg。
如何下载到本工程的vendor下?
矛盾之处:工程本身在github.com下开发,未提交版本,但go guild时会查找,找不到,报错。go mod download
下载依赖,默认pkg目录(可共用)go mod tidy
同步依赖包,添加需要的,移除多余的go mod vendor
将依赖包拷贝到vendor目录go get 下载/升级依赖.mod所在目录:
go build -mod vendor main.go go env -w GO111MODULE=off  auto on

govendor使用

使用go get下载的第三方包,会下载到src目录下。

下载govendor并安装:go get -u -v github.com/kardianos/govendor
下载包到vendor目录:govendor fetch github.com/golang/glog。(注:自动下载该包相关的依赖包)
添加包到vendor目录:govendor add github.com/golang/glog
删除包:govendor remove github.com/golang/glog
其它命令:

gopm使用

查看工程依赖包工具。

下载安装:

go get -v -u github.com/gpmgo/gopm

用法:

# 查看当前工程依赖
gopm list
# 显示依赖详细信息
gopm list -v
# 列出文件依赖
gopm list -t [file]
# 拉取依赖到缓存目录
gopm get -r xxx
# 仅下载当前指定的包
gopm get -d xxx
# 拉取依赖到$GOPATH
gopm get -g xxx
# 检查更新所有包
gopm get -u xxx
# 拉取到当前所在目录
gopm get -l xxx
# 运行当前目录程序
gopm run
# 生成当前工程的 gopmfile 文件用于包管理
gopm gen -v
# 根据当前项目 gopmfile 链接依赖并执行 go install
gopm install -v
# 更新当前依赖
gopm update -v
# 清理临时文件
gopm clean
# 编译到当前目录
gopm bin3. 通过gopm 来安装gin框架gopm get -g -v  github.com/gin-gonic/gin4. 安装govendor管理包工具gopm get -g -v github.com/kardianos/govendor5. 通过 govendor 来管理代码包6. go run main.go文件,可能会出现缺少golang.org/x,提示报错/root/gowork/src/attendance_project/vendor/golang.org/x/sys/unix (vendor tree)
/usr/local/src/go/src/golang.org/x/sys/unix (from $GOROOT)
/root/gowork/src/golang.org/x/sys/unix (from $GOPATH),通过 gopm -g golang.org/x/sys (sys只是其中的一个模块,例如:text,sys等,具体根据提示来安装即可)

swagger

go get -u github.com/swaggo/swag/cmd/swag
(所遇问题:golang.org\x目录的tools和net的git版本有点旧,会自动更新,但连接不上,解决:先删除,从Github.com上下载)go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/gin-swagger/swaggerFiles
go get -u github.com/alecthomas/template  // 文档需要

格式检查vet

在VS code中打开go文件,右下角提示goreturns要安装(具体提示未记录),点击安装。
当保存go文件时会自动检测语法,并提示。

参考资源

1、Go项目结构推荐。

李迟 2020 上半年 起稿并修改 2020.08.20 周四 修改

Golang实践录:工程管理相关推荐

  1. Golang实践录:命令行cobra库实例再三优化

    本文是上一文章<Golang实践录:命令行cobra库实例优化> 的优化,主要的子命令的业务实现的整理. 起因 上一版本实现的方式,还是有点不满意,格式也不对齐,重要的是,似乎不是正规的方 ...

  2. Golang实践录:命令行cobra库实例优化

    本文上一文章<Golang实践录:命令行cobra库实例> 的优化,主要的子命令的业务实现的整理. 起因 旧版本中,每个子命令的入口函数,均需一一判断传入参数,并调用对应的业务实现函数,编 ...

  3. Golang实践录:生成版本号和编译时间

    本文介绍如何在 Golang 中生成和管理版本号及编译时间. 一.起因 笔者手上有几份祖传代码,最早一份90年代末写,次早是 2012 年写的,最新的代码,也是 2016 年写的,版本号倒有,但没有版 ...

  4. Golang实践录:使用gin框架实现转发功能:管理后端服务

    近段时间需要实现一个转发 post 请求到指定后端服务的小工具,由于一直想学习 gin 框架,所以就使用这个框架进行尝试,预计会产生几篇文章.本文研究如何管理后端服务. 思路 在启动 gin 服务前, ...

  5. Golang实践录:静态资源文件整合:web服务

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文研究静态资源文件的在 web 服务器的整合. 基础 Golang 中的 web 服务框架有很多种,本文选取 gi ...

  6. Golang实践录:调用C++函数

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中调用 C++ 函数. 起因 因工作需求,需要将一个工具由终端行的运行方式迁移到 we ...

  7. Golang实践录:我的工具包

    程序员难免会自造轮子,因为有时候自己的轮子才更适合自己,golang 的生态圈不错,官方的,非官方都有很多不同功能的库.本文从小处着眼,基于 github 开源工程创建属于自己的工具包. 简单介绍 本 ...

  8. Golang实践录:命令行cobra库实例

    本文使用 cobra 库实现一个命令行工具,类似 git.docker.kubectl 这类的工具. 本文仅为一个初具模型的示例,但有实践参考意义. 起因 在编程中,很多时候,程序都会处理多个参数,特 ...

  9. Golang实践录:开篇

    自去年开始,因工作的关系,需要使用 Golang 进行开发.一来是工作,二来多了解一个新语言,总归是有好处.现在虽然不是主攻 Golang,但可能用来写一些小工具. 本系列不会系统介绍Golang,只 ...

最新文章

  1. keras 的 example 文件 imdb_bidirectional_lstm.py 解析
  2. numpy.array()基本操作
  3. 批量 kill mysql 中运行时间长的sql
  4. 利刃 MVVMLight 8:DispatchHelper在多线程和调度中的使用
  5. SessionLocaleResolver
  6. 随机取6位数字或字母方法
  7. activemq安全设置 设置admin的用户名和密码
  8. Python中yield简单用法
  9. Gradle项目同步失败错误
  10. Hibernate JPA 效率低下的原因
  11. kdays 游戏汉化教程[日记版本] 序章 接触
  12. 广义最小二乘法的基本思想是什么_解决异方差问题的方法可行广义最小二乘法fgls法.ppt...
  13. pdf文件预览 浏览器窗口名修改
  14. 肖特基和快恢复二极管区别
  15. 《IT通史》读后感一
  16. 淘宝非标品类目商品开车如何选词?[淘宝插旗、创建订单api]
  17. javascript购物车实现详细代码讲解
  18. 申请ssl 验证域名 失败了 中间证书
  19. XStream 简介
  20. 《当程序员的那些狗日日子》(二十八)开展新工作

热门文章

  1. 疑似iQOO Neo6通过3C认证:最高支持80W快充
  2. 《数字时代汽车营销变革白皮书》发布,为新消费时代的车企营销提供指南
  3. iPhone 13系列电池容量最高4350mAh 较iPhone 12提升近20%
  4. 年度影像旗舰vivo X70系列正式发布 售价3699元起
  5. 外媒:苹果高管正拜访亚洲供应商,探讨苹果汽车生产事宜
  6. 互联网“收割”网瘾父母
  7. 黑鲨4游戏手机开启预热:4>5+6+7 比竞品更胜一筹
  8. 滴滴出行:10月国内月活用户突破4亿
  9. 又一辆特斯拉电动汽车撞上警车,都是因为这个功能
  10. 您的618快递正在燃烧?12吨快递货车高速上起火,网友:代入感极强!