一、背景和基础
go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已经被正式推荐在生产环境下使用了。
注意:在一个项目(project)下我们是可以定义多个包(package)的。
├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go
你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在 go.mod 文件中使用 replace 指令。
replace顾名思义,就是用新的package去替换另一个package。
二、Go Module 引入本地自定义包
Go Module 引入本地自定义包
参考URL: http://www.r9it.com/20190611/go-mod-use-dev-package.html
Go Module 版本规则
go modules 是一个版本化依赖管理系统,版本需要遵循一些规则,打开一个 go.mod 文件,你会发现类似下面的依赖规则:
依赖规则由两个部分组成,前面一部分是包路径,后面一部分表示的是版本号。 你会发现有两种版本号,一种是我们很熟悉的 git 标签,比如 v0.0.2,另一种就比较复杂一些,它是:版本号 + 时间戳 +hash 比如:v0.0.0-20190212224330-8d79a5489543,它其实是精准的对应着一个 git log 记录,时间是git提交的时间,后面的哈希是去提交哈希的前 12 位。
比如我当前的提交记录是这样的:
$ git log
commit 4c55783279db32be4f02e193713d5a862b96db85 (HEAD -> master, origin/master)
Author: yangjian <yangjian102621@gmail.com>
Date: Mon Jun 10 18:34:14 2019 +0800
则我的最新版本号应该为 v0.0.0-20190610103414-4c55783279db
replace (
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 => github.com/golang/crypto v0.0.0-20190308221718-c2843e01d9a2
)
使用 replace 将远程包替换为本地包服务
module GoRoomDemo
go 1.12
require (
github.com/gin-gonic/gin v1.3.0
github.com/gohouse/goroom v0.0.0-20190327052827-9ab674039336
github.com/golang/protobuf v1.3.1 // indirect
github.com/gomodule/redigo v2.0.0+incompatible
github.com/mattn/go-sqlite3 v1.10.0
github.com/stretchr/testify v1.3.0 // indirect
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 // indirect
)
这是一个简单的GoRoom框架的依赖关系包, 如果我想使用本地的goroom, 只需要使用replace即可
module GoRoomDemo
go 1.12
require (
github.com/gin-gonic/gin v1.3.0
github.com/gohouse/goroom v0.0.0-20190327052827-9ab674039336
github.com/golang/protobuf v1.3.1 // indirect
github.com/gomodule/redigo v2.0.0+incompatible
github.com/mattn/go-sqlite3 v1.10.0
github.com/stretchr/testify v1.3.0 // indirect
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 // indirect
)
replace github.com/gohouse/goroom => /path/to/go/src/github.com/gohouse/goroom
默认使用 github.com/gohouse/goroom 包会到 Github 上去下载,但这个包还在本地开发中并未push到线上,那么可以通过 replace 配置来重定向当前项目对该包的加载路径。
三、Go Module:私有不合规库怎么解决引用问题
Go Module:私有不合规库怎么解决引用问题
参考URL: https://developer.51cto.com/article/682237.html
go modules 使用本地库、公开库和私有库
参考URL:https://blog.csdn.net/qingchuwudi/article/details/107119273
实际项目中,使用 Go Module 难免会有一些自己的库要引用,这些库使用自建的 Git 服务管理,比如 GitLab 等。针对这样的情况,不少教程都是让设置 GOPRIVATE,即不走 GOPROXY。
然而,有些时候,不仅库是私有的,而且地址很可能不是「合规」的。什么是「不合规」的?
不是 HTTPS 问题不大,主要是非 443 或 80,以及直接 IP 地址的问题比较大。因为 Go 不支持下面的语法:
import "studygolang.com:8081/polarisxu/util"
import "192.168.1.1:80/polarisxu/util"
一般地,我们应该避免出现这样的情况,毕竟太恶心,而且没必要自讨苦吃。
可以参考原文,但是最好避免这种情况!
四、参考
使用go module导入本地包
参考URL: https://zhuanlan.zhihu.com/p/109828249