Categorygithub.com/wenit/go-mod
module
0.9.2
Repository: https://github.com/wenit/go-mod.git
Documentation: pkg.go.dev

# README

go mod管理工具

发布日期版本号作者描述
2020年10月03日0.9.2zwb

目录

[TOC]

更新日志

更新日期版本号作者描述
2020年10月04日0.9.2zwb增加部署功能
2020年10月03日0.9.1zwb优化打zip包逻辑
2020年10月02日0.9.0zwb初始版本

关于勘误

由于时间水平都比较有限,所有文档中难免会出现些纰漏和错误,如果大家发现了一些问题,欢迎大家提交issue反馈

Go包管理

Go1.5 之前用 GOPATH 以及 GOROOT 这两个环境变量来管理包的位置,GOROOTGo 的安装目录,以及编译过程中使用到的系统库存放位置,如fmt。Go1.5Go1.7 开始稳定到 Vendor 方式,即依赖包需要放到 $GOPATH/src/vendor 目录下,这样每个项目都有自己的 vendor 目录,但是如果依赖同样的三方包,很容易造成资源重复,Go vendor 出现了几种主流的管理工具,包括 godepgovendorgolide等。

Go1.11 之前,GOPATH 是开发时的工作目录,其中包含三个子目录:

  • src目录:存放go项目源码和依赖源码,包括使用 go get 下载的包
  • bin目录:通过使用 go install 命令将 go build 编译出的二进制可执行文件存放于此
  • pkg目录:go源码包编译生成的lib文件存储的地方

Go1.11 之前,import 包时的搜索路径

  • GOROOT/src: 该目录保存了Go标准库代码(首先搜寻导入包的地方)
  • GOPATH/src: 该目录保存了应用自身的各个包代码和第三方依赖的代码
  • ./vendor :vendor 方式第三方依赖包(如果支持Vendor)

在 Unix 和类 Unix 系统上,GOPATH 默认值是 $HOME/go,Go1.11 版本后,开启 GO Modules 后,GOPATH的作用仅仅为存放依赖的目录了。

Go1.11 版本之前,GOPATH 是必需的,且所有的 Go 项目代码都要保存在 GOPATH/src 目录下,也就是如果想引用本地的包,你需要将包放在 $GOPATH/src 目录下才能找得到。Go1.11 版本之后,GO 官方引入了 Go Modules,不仅仅方便的使用我们的依赖,而且还对依赖的版本进行了管理。

在Go1.11后通过 go mod vendor-mod=vendor来实现 Vendor 管理依赖方式。本来在 vgo 项目(Go Modules前身)是要完全放弃 vendor,但是在社区反馈下还是保留了。总之就是在 Go.1.11 之后需要开启 Go Modules 条件下才能使用 Vendor,具体地感兴趣或还沿用了 Vendor 的朋友可以去了解下,不过建议以后仅使用 Go Modules 包管理方式了

总体介绍

虽然Go1.11 引入了Go Modules的包管理机制,但是依然存在一些问题:

  1. 项目需要托管在公共仓库上,比如GitHub,GitLab等,对于内部私有项目存在一些问题
  2. 虽然一些办法解决私有项目访问权限的问题,但是配置过于繁琐,详见 Go Modules私有项目配置

Javanodejs一样通过mavennpm去进行管理,java、nodejs私有包都可以通过nexus发布进行管理,解决项目内部私有话访问问题,我希望Go也有这样方式;找了很多资料,发现 athens 是一个比较理想的私有化包管理方案,详解介绍:不一样的go语言-athens私仓安装,虽然解决私有包下载问题,但是如何比较友好的发布至athens,没有提供一个好的办法。

为了解决以上问题,开发了go-mod 命令行工具,用于管理本地Go私有项目,用于go mod的打包、安装、发布,配合 athens使用就更加完美了。

功能列表

  • 打包

    将本地Go Module项目打包,可手工将此包部署至athens

  • 安装

    将本地Go Module项目安装到本地Go mod缓存目录,方便

  • 发布

    • 将本地Go Module项目并发布至go-mod-proxy

      go-mod-proxy安装部署

    • 将本地Go Module项目并发布至athens待实现

  • 清理

    清理本地打包目录

安装步骤

方式一:安装最新版本

git clone源码,然后执行scripts中的build.sh脚本进行打包,生成文件在项目的releases目录下

方式二:直接Releases中直接下载对应版本

windows版本: go-mod_0.9.2_windows_amd64.exe

linux版本:go-mod_0.9.2_linux_amd64

mac版本:go-mod_0.9.2_darwin_amd64

下载完成后,重名为简单名字比如go-mod.exe,然后配置好PATH环境变量就可以直接使用了

使用文档

1. 前提条件

1)配置GOBIN环境变量

默认目录在$user_home/go目录下

2)配置GONOSUMDB

GONOSUMDB Go环境变量用于设置哪些前缀的模块都被视为私有模块,不进行HASH检验,通过逗号分隔配置多个匹配路径,因为我们的打包项目未生成hash校验值,所以需要配置,后续实现校验文件,就无需进行配置

go env -w GONOSUMDB=github.com/wenit

也可通过关闭整个HASH校验,不建议这么做

GOSUMDB="off"                                                   # 关闭校验,任何模块可以被使用

2. 子命令

go-mod.exe help
使用说明:

Usage:
  go-mod.exe
  go-mod.exe [command]

Available Commands:
  clean       清理目录
  help        更多帮助文档
  install     安装go module到本地module库
  package     本地项目打包

Flags:
  -h, --help      帮助信息
  -v, --version   版本信息

Use "go-mod.exe [command] --help" for more information about a command.

3. 项目打包

帮助文档

go-mod.exe package --help
Package your Go modules

Usage:
  go-mod.exe package [flags]

Flags:
  -e, --excludes string   排除目录,多个目录使用逗号分割 (default ".svn,.git,.vscode,target,releases")
  -f, --from string       输入目录 (default ".")
  -h, --help              help for package
  -t, --to string         输出目录 (default "./target")
  -v, --version string    输出版本号 (default "v1.0.0")

示例

输入:

go-mod.exe package -f F:/github/go-mod

输出:

2020/10/02 11:00:21 项目打包完成,输出目录:./target

4. 项目安装

帮助文档

go-mod.exe install --help
安装go module到本地module库

Usage:
  go-mod.exe install [flags]

Flags:
  -e, --excludes string   排除目录,多个目录使用逗号分割 (default ".svn,.git,.vscode,target,releases")
  -f, --from string       输入目录 (default ".")
  -h, --help              help for install
  -t, --to string         输出目录 (default "./target")
  -v, --version string    输出版本号 (default "v1.0.0")

示例

输入:

go-mod.exe install -f F:/github/go-mod -v v1.1.0

输出:

go-mod.exe install -f F:/github/go-mod -v v1.1.0
2020/10/02 11:00:44 项目打包完成,输出目录:./target
2020/10/02 11:00:44 项目解压至本地mod仓库,输出目录:C:\Users\wenit\go\pkg\mod
2020/10/02 11:00:44 复制info文件至缓存目录[C:\Users\wenit\go\pkg\mod\cache\download\github.com\wenit\go-mod\@v\v1.1.0.zip]完成
2020/10/02 11:00:44 复制mod文件至缓存目录[C:\Users\wenit\go\pkg\mod\cache\download\github.com\wenit\go-mod\@v\v1.1.0.zip] 完成
2020/10/02 11:00:44 复制zip文件至缓存目录[C:\Users\wenit\go\pkg\mod\cache\download\github.com\wenit\go-mod\@v\v1.1.0.zip] 完成

5. 项目发布

帮助文档

go-mod.exe deploy --help
安装go module到本地module库,并部署至go-mod-proxy

Usage:
  go-mod.exe deploy [flags]

Flags:
  -e, --excludes string    排除目录,多个目录使用逗号分割 (default ".svn,.git,.vscode,target,releases")
  -f, --from string        输入目录 (default ".")
  -h, --help               help for deploy
  -p, --proxyaddr string   go-mod-server的api服务地址,端口一般为go-mod-server的代理端口+1
  -t, --to string          输出目录 (default "./target")
  -v, --version string     输出版本号 (default "v1.0.0")

示例

输入:

go-mod.exe deploy -f f:/github/go-mod -v v1.1.2 -p http://localhost:8082/upload

输出:

2020/10/04 18:37:01 部署私服地址:http://localhost:8082/upload
2020/10/04 18:37:01 项目打包完成,输出目录:./target
2020/10/04 18:37:01 项目解压至本地mod仓库,输出目录:C:\Users\zwb\go\pkg\mod
2020/10/04 18:37:01 复制info文件至缓存目录[C:\Users\zwb\go\pkg\mod\cache\download\github.com\wenit\go-mod\@v\v1.1.2.zip]完成
2020/10/04 18:37:01 复制mod文件至缓存目录[C:\Users\zwb\go\pkg\mod\cache\download\github.com\wenit\go-mod\@v\v1.1.2.zip] 完成
2020/10/04 18:37:01 复制zip文件至缓存目录[C:\Users\zwb\go\pkg\mod\cache\download\github.com\wenit\go-mod\@v\v1.1.2.zip]
完成
2020/10/04 18:37:01 复制ziphash文件至缓存目录[C:\Users\zwb\go\pkg\mod\cache\download\github.com\wenit\go-mod\@v\v1.1.2.ziphash]完成
2020/10/04 18:37:01 上传成功[github.com/wenit/go-mod-v1.1.2]

参考引用

本项目参考:pacmod 实现

# Packages

No description provided by the author
No description provided by the author