go mod replace

在同一个项目下
注意:在一个项目(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




  1. go build 时出现 no matching versions for query “latest”
    错误原因
    go build 检测不到依赖



解决方案
如果是外部依赖的话, 确认依赖在 $GOPATH/pkg/mod/ 目录下存在
如果是项目内部依赖的话, 同样需要确认依赖的代码在项目目录下存在



  1. 执行 go build/test 时出现 used for two different module paths
    错误原因
    在 go.mod 使用了 replace 语句将一个依赖 A 的地址替换为另一个依赖 B, 如果 B 本身就已经被项目使用的话, 就会出现这个错误, 相当同一个依赖被不同的 import 路径给引入了, 这是不允许的



比如在 go.mod 中将 thrift 替换为内部依赖



replace a v0xxx => b xxx
如果在代码里同时 import 了 a 和 b 的话, 就会报错



解决方案
将 replace 中的依赖 B 更换为一个没有在项目中被使用过的引入路径(比如可以新建一个 git 仓库来放依赖 A)




  1. 安装依赖出现 unknown revision
    错误原因
    使用 go mod 从 git 上拉仓库时, 会有很小概率出现明明仓库打了 tag/release, 但是 go mod 却怎么也不能识别的情况
    解决方案
    go.mod 中的依赖不仅可以是为一个具体版本, 也可以是一个 commit, 可以通过 git 上找到版本对应的 commit 并进行替换



比如 通过 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/



Category golang