记录Go工作区的问题

458 阅读2分钟

一个Java熟练工尝试使用go,意识到go的依赖管理好像没有那么完备,特别是在进行多模块化的开发工程中,尽管go的1.18之后引入了worksapce之后,问题依然存在!

使用workspace的时候,当尝试使用go mod tidy进行其他依赖下载,提示错误如下: cannot find module providing package github.com/common/pkg: module github.com/common/pkg: git ls-remote -q origin in /Users/Shared/data/go/pkg/mod/cache/vcs/293cd1df7ee8ce7fa68aa1f931af570c91b78db2ec41eceb7da896b86b32fca8: exit status 128: fatal: unable to access 'https://github.com/common/pkg/': Empty reply from server

项目结构

workspace
├── app
│   ├── cmd
│   │   └── main.go
│   └── go.mod
├── bus
│   ├── go.mod
│   └── pkg
│       └── hello.go
├── commom
│   ├── go.mod
│   └── pkg
│       └── hello.go
└── go.work

这是我项目的workspace,在go.work文件中,我指定使用了bus、commom两个模块,内容如下:

go 1.20
use (
   ./bus
   ./commom
   app
)

bus的go.mod文件:

module github.com/bus
go 1.20

commom的go.mod文件

module github.com/common
go 1.20

app的go.mod文件

module app

go 1.20

在app项目中的main.go文件中,我使用了这两个模块提供的方法

package main

import (
   bus "github.com/bus/pkg"
   common "github.com/common/pkg"
)

func main() {
   bus.Hello()
   common.Hello()
}

然后执行main方法:

[xx🦉🦉🦉app]$ go run cmd/main.go 
Bus...Bus...
Common...Common

很好,这符合我们的预期,app项目在运行的时候直接使用工作区的提供的方法,而不是到github上去获得依赖。

如果我们还依赖了其它第三方依赖,那么我们可能需要使用go mod来下载我们需要的依赖,执行命令后报错如下 cannot find module providing package github.com/common/pkg: module github.com/common/pkg: git ls-remote -q origin in /Users/Shared/data/go/pkg/mod/cache/vcs/293cd1df7ee8ce7fa68aa1f931af570c91b78db2ec41eceb7da896b86b32fca8: exit status 128: fatal: unable to access 'https://github.com/common/pkg/': Empty reply from server

结果有点意外,我们期望go mod 会自动跳过本地依赖,但实际上不是,它仍然会去github下载依赖。

那如果app的go.mod引入依赖,然后在go.work使用replace,官方说go.work的优先级要高于go.mod,所以写在go.work文件中的replace是不是就相当于与在go.mod添加相同的依赖呢???于是尝试做修改如下:

require (
     github.com/common v1.0.0
     github.com/bus v1.0.0
)

然后再go.work增加

replace (
     github.com/common v1.0.0 => ./commom
     github.com/bus v1.0.0 => ./bus
)

很遗憾,go mod会忽略go.work文件,继续下载第三方的依赖。于是报错:

go: downloading github.com/common v1.0.0 go: downloading github.com/bus v1.0.0 app/cmd imports github.com/bus/pkg: invalid github.com import path "github.com/bus" app/cmd imports github.com/common/pkg: invalid github.com import path "github.com/common"

那么,如果非要解决这个问题怎么办,那么只能在app的go.mod添加replace命令了,那么在提交代码的时候就只能手动删除了这些命令了。

在github上,发现有开发遇到相同的问题,issues/50750,希望后面的版本能解决这个问题。