在同一个项目下
注意:在一个项目(project)下我们是可以定义多个包(package)的。
因为这两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod文件中使用replace指令。
在调用方也就是packagedemo/go.mod中按如下方式指定使用相对路径来寻找mypackage这个包。
module moduledemo
go 1.14
require “mypackage” v0.0.0
replace “mypackage” => “../mypackage”
https://zhuanlan.zhihu.com/p/109828249
提示找不到 gitee.com/rockyang/testmod,是因为你没有把仓库推送到远程,所以无法下载。 go module 提供了另外一个方案, 使用 replace, 编辑 go.mod 文件,在最后面添加: replace gitee.com/rockyang/testmod => /gopath/src/gitee.com/rockyang/testmod
http://www.r9it.com/20190611/go-mod-use-dev-package.html
https://n3xtchen.github.io/n3xtchen/go/2018/10/30/go-mod-local-pacakge
https://frankhitman.github.io/zh-CN/go_module/
go modules - replace does not work - replacement module without version must be directory path (rooted or starting with
替换的时候必须使用绝对路径或者相对路径,不能用gopath下的路径
https://stackoverflow.com/questions/55533971/go-modules-replace-does-not-work-replacement-module-without-version-must-be
https://juejin.im/post/5c9c8c4fe51d450bc9547ba1
https://www.zhihu.com/question/298126236
https://www.cnblogs.com/apocelipes/p/10295096.html
https://www.w3xue.com/exp/article/20191/18332.html
https://jaycechant.info/2020/golang-1-13-module-VS-package/
cannot load xxxx: malformed module path “xxxxxx”: missing dot in first path element
这个原因是go.mod文件中,module指定的名字跟实际目录不匹配,改成对应路径即可
如果发现downloadpkg时间很长或者失败,verifying xxx: xxx: malformed record data
可能没有设置GOPROXY=
如果发现已有的库404 请检查GOPROXY 是否有direct
解决方案
如果是外部依赖的话, 确认依赖在 $GOPATH/pkg/mod/ 目录下存在
如果是项目内部依赖的话, 同样需要确认依赖的代码在项目目录下存在
比如在 go.mod 中将 thrift 替换为内部依赖
replace a v0xxx => b xxx
如果在代码里同时 import 了 a 和 b 的话, 就会报错
解决方案
将 replace 中的依赖 B 更换为一个没有在项目中被使用过的引入路径(比如可以新建一个 git 仓库来放依赖 A)
比如 通过 github 上仓库下载 xx 的方式就是用的 commit 号
replace xx v0.2.3 => github.com/axzx v0.0.0-20161001171628-53dd39sda08
时间戳 commitid
https://learnku.com/articles/27401
https://juejin.im/post/5c8e503a6fb9a070d878184a
https://thewebivore.com/using-replace-in-go-mod-to-point-to-your-local-module/
踩坑
xxx/conf imports
xxo: git ls-remote -q https://git.xxx in /Users/goLang/pkg/mod/cache/vcs/43d75fac7a7d83b: exit status 128:
Warning: Permanently added ‘git. xx’ (ECDSA) to the list of known hosts.
解决办法
go.mod
replace git/xiazemin/mo latest => ../xiazemin/mo
go mod tidy
git/xiazemin/mo: parsing ../../xiazemin/mo/go.mod: open /Users/xiazemin/mo/go.mod: no such file or
directory
解决办法
cd ../xiazemin/mo
go mod init
注意在子package里不能有 .mod文件
否则会报错
xxo: git ls-remote -q https://git.xxx in /Users/goLang/pkg/mod/cache/vcs/43d75fac7a7d83b: exit status 128:
删除即可
果果还有问题,检查下是否有/
否则
replace git/xiazemin/mo/ latest => ../xiazemin/mo
代码引用 git/xiazemin/mo/a
会报错 xxo: git ls-remote -q https://git.xxxxiazemin/mo/a in /Users/goLang/pkg/mod/cache/vcs/43d75fac7a7d83b: exit status 128:
模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
由于 go.mod会扫描同工作目录下所有 package 并且变更引入方法
https://juejin.im/post/5c8e503a6fb9a070d878184a
module 与 package
0x0 module 不是 package
是的,他们不是同一个概念!!module(模块)是新引入的概念,一个 module 是 零到多个 package(包)的组合,不要把他们混为一谈。
package module
本质 一个目录下所有 go 源码的集合(不包括子目录,那是另一个 package) 同一个根目录下所有包的集合(包括子目录)
共享 代码 共享命名空间(包名),包内可以 直接互相调用(包括小写开头的 unexported members) 同一个 module 下的 package 共享 module path 作为 package path 的前缀,module 内可以 直接互相 import
单位 (代码开头)import 的单位 (go.mod)require 的单位
package 具体体现为一个目录下所有 go 源码的集合(不包括子目录,那是另一个 package),它们 共享命名空间(包名),包内可以 直接互相调用(包括小写开头的 unexported members)。package 是 import 的单位 ,import 语句写在每一个 go 源码文件的开头。
包名跟目录名 可以一样也可以不一样。虽然允许不一样,但是大家习惯性认为目录就是包名;为了避免大家还要去查包名, 没什么特别理由建议保持一致。
例如,import path/to/pkg_dir 中的 pkg_dir 是目录名,package pkg 和 pkg.MyFunc() 里的 pkg 是包名。
module 则是同一个根目录下所有包的集合(包括子目录),它们 共享 module path 作为 package path 的前缀,module 内可以 直接互相 import。module 是 require 的单位 ,require 语句在 go.mod 里。
https://jaycechant.info/2020/golang-1-13-module-VS-package/