构建可复用模块

Golang 的工程管理一直是初学者所不能很好的理解的事物,本篇主要讲述了在 Golang 中如何进行工程管理,如何构建可复用模块,从 GitHub 获取 Go 的包是如何操作的,以及 Golang 的包管理工具的基本使用,这样再进行项目开发的时候就可以模块化的管理自己的工程,首先还得从 Package 说起!

mark

package

1、基本复用模块单元,以首字母大写来表明可被包外代码访问
2、代码的 package 可以和所在的目录不一致
3、同一目录里的 Go 代码的 package 要保持一致
4、通过 go get 来获取远程依赖

  • go get -u 强制从网络更新远程依赖

5、注意代码在 Github 上的组织形式,以适应 go get

  • 直接以代码路径开始,不要有 src

注意 GOPATH 的配置

init 函数

1、在 main 被执行前,所有依赖的 package 的 init 方法都会被执行
2、不同包的 init 函数按照包导入的依赖关系决定执行顺序
3、每个包可以有多个 init 函数
4、包的每个源文件也可以有多个 init 函数,这点比较特殊

mark

远程获取包

就拿这个 concurrentMap 来说吧,这是一个 Go 语言的 concurrentMap 实现, https://github.com/easierway/concurrent_map 现在假设我们需要引入这个包,(在配置好 GOPATH 的情况下)直接使用命令搞定:

mark

命令执行完毕就会在 GOPATH 的目录下直接把 go 源文件拉下来,接下来导入就好了

mark

所以我们在提交自己的开源项目的时候,别把 src 目录放进去,只要把代码的路径放在相对根目录下就好了,比如:mark

依赖管理

Go 未解决的依赖问题:
1、同一环境下,不同项目使用同一包的不同版本
2、无法管理对包的特定版本的依赖

vender 路径

随着 Go 1.5 release 版本的发布,vendor 目录被添加到除了 GOPATH 和 GOROOT 之外的依赖目录查找的解决方案。在 Go1.6 之前,你需要手动的设置环境变量

查找依赖包路径的解决方案如下:
1、当前包下的 vendor 目录
2、向上级目录查找,直到找到 src 下的 vendor 目录
3、在 GOPATH 下面查找依赖包
4、在 GOROOT 目录下查找

常用的依赖管理工具:

mark

接下来就简单演示一下 glide 在 Windows 下的使用:

1、首先安装 glide,推荐直接通过 go 的源码安装

进入 GOPATH 路径:比如我的 GOPATH 路径是 D:\mycode\practic_code\go_learning\

1
D:\mycode\practic_code\go_learning>go get -u github.com/Masterminds/glide

编译 glide

1
D:\mycode\practic_code\go_learning\src\github.com\Masterminds\glide>go build glide.go

如何配置正确 glide.exe 应该是在 bin 目录中,但是执行 glide install 命令的时候有错误,需要更改

github.com\Masterminds\glide\path\winbug.go

mark

好了,接下来重新编译出 glide.exe,如果没在 bin 中,把它放到 bin 目录就好了

2、glide init 命令

假设我的一个工程依赖与某个远程 package

mark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
D:\mycode\practic_code\go_learning\src\ch15\remote>glide init
[INFO] Generating a YAML configuration file and guessing the dependencies
[INFO] Attempting to import from other package managers (use --skip-import to skip)
[INFO] Scanning code to look for dependencies
[INFO] --> Found test reference to github.com\easierway\concurrent_map
[INFO] Writing configuration file (glide.yaml)
[INFO] Would you like Glide to help you find ways to improve your glide.yaml configuration?
[INFO] If you want to revisit this step you can use the config-wizard command at any time.
[INFO] Yes (Y) or No (N)?
Y
[INFO] Looking for dependencies to make suggestions on
[INFO] --> Scanning for dependencies not using version ranges
[INFO] --> Scanning for dependencies using commit ids
[INFO] Gathering information on each dependency
[INFO] --> This may take a moment. Especially on a codebase with many dependencies
[INFO] --> Gathering release information for dependencies
[INFO] --> Looking for dependency imports where versions are commit ids
[INFO] Here are some suggestions...
[INFO] The package github.com/easierway/concurrent_map appears to have Semantic Version releases (http://semver.org).
[INFO] The latest release is 0.9.1. You are currently not using a release. Would you like
[INFO] to use this release? Yes (Y) or No (N)
Y
[INFO] Would you like to remember the previous decision and apply it to future
[INFO] dependencies? Yes (Y) or No (N)
Y
[INFO] Updating github.com/easierway/concurrent_map to use the release 0.9.1 instead of no release
[INFO] The package github.com/easierway/concurrent_map appears to use semantic versions (http://semver.org).
[INFO] Would you like to track the latest minor or patch releases (major.minor.patch)?
[INFO] The choices are:
[INFO] - Tracking minor version releases would use '>= 0.9.1, < 1.0.0' ('^0.9.1')
[INFO] - Tracking patch version releases would use '>= 0.9.1, < 0.10.0' ('~0.9.1')
[INFO] - Skip using ranges
[INFO] For more information on Glide versions and ranges see https://glide.sh/docs/versions
[INFO] Minor (M), Patch (P), or Skip Ranges (S)?
S
[INFO] Would you like to remember the previous decision and apply it to future
[INFO] dependencies? Yes (Y) or No (N)
Y
[INFO] Configuration changes have been made. Would you like to write these
[INFO] changes to your configuration file? Yes (Y) or No (N)
Y
[INFO] Writing updates to configuration file (glide.yaml)
[INFO] You can now edit the glide.yaml file.:
[INFO] --> For more information on versions and ranges see https://glide.sh/docs/versions/
[INFO] --> For details on additional metadata see https://glide.sh/docs/glide.yaml/

D:\mycode\practic_code\go_learning\src\ch15\remote>

提示的意思其实很清楚,按照它的提示一步一步来就好了,会在目录下生成 glide.yaml,就和 Maven 一样的:

1
2
3
4
5
package: ch15/remote
import: []
testImport:
- package: github.com/easierway/concurrent_map
version: 0.9.1

3、glide install 命令

执行完毕后,发现依赖被弄到了 vender 文件夹底下,所以与其说是导包,不如说是直接把依赖的 go 文件下载下来了,放到 vender 目录下,这就是 glide 的管理方式:

mark