为了联调把依赖 replace 到同级目录,本地一切正常,推到持续集成后构建直接报 `module ../common: reading ../common/go.mod: no such file or directory`,同一个 commit 在两台机器上两种结果。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,replace 写的是相对路径,只在当前机器的工作区布局下成立,CI 只拉当前仓库,兄弟目录根本不存在,路径解析失败,构建自然过不去,和代码本身没有关系。
「replace 本地路径」这类改动最怕改一半,回滚脚本先准备好,再动生产。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
grep -n 'replace' go.mod go list -m all | head go build ./... && git diff go.mod
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,先确认这条替换指令是不是只在本地临时使用;提交之前删掉所有指向本地路径的替换指令;确实需要长期共存就走私有仓库或者子模块。
最后用这个标准收尾,持续集成构建通过,模块文件里不再有指向仓库外的相对路径。
