Go库:找不到提供包库的模块

Go库:找不到提供包库的模块,go,packaging,go-modules,Go,Packaging,Go Modules,我正在创建3个独立的go项目:ace,aces客户端,以及两个项目共享的库aceslib。根据go文档,我在包含共享库时遇到问题() aceslib中的所有go文件都共享包名aceslib。我正在使用导入库“aceslib”将库包括在ace和aces客户端中。我可以使用go build构建库,并使用go install安装库,在目录列表中可以看到创建了文件go/pkg/windows\u amd64/aceslib.a 但当我试图构建ace或ace客户端时,go抱怨: $ go build b

我正在创建3个独立的go项目:
ace
aces客户端
,以及两个项目共享的库
aceslib
。根据go文档,我在包含共享库时遇到问题()

aceslib中的所有go文件都共享包名
aceslib
。我正在使用导入库“aceslib”将库包括在ace和aces客户端中。我可以使用
go build
构建库,并使用
go install
安装库,在目录列表中可以看到创建了文件
go/pkg/windows\u amd64/aceslib.a

但当我试图构建
ace
ace客户端时,go抱怨:

$ go build 
build ace: cannot load aceslib: cannot find module providing package aceslib
我的go设置:

$ go version
go version go1.12.9 windows/amd64
$ go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Yulivee\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\Yulivee\go
set GOPROXY=
set GORACE=
set GOROOT=c:\go
set GOTMPDIR=
set GOTOOLDIR=c:\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\Users\Yulivee\go\src\ace\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\Yulivee\AppData\Local\Temp\go-build024649150=/tmp/go-build -gno-record-gcc-switches
目录结构:

.
├── bin
│   ├── ace-client.exe
│   └── ace.exe
├── pkg
│   ├── mod
│   │   ├── cache
│   │   └── golang.org
│   └── windows_amd64
│       ├── ace
│       ├── aceslib.a
│       └── golang.org
└── src
    ├── ace
    │   ├── README.md
    │   ├── go.mod
    │   ├── go.sum
    │   └── main.go
    ├── ace-client
    │   └── main.go
    ├── aceslib
    │   ├── README.md
    │   ├── crypto.go
    │   ├── go.mod
    │   └── utils.go
我错过了什么


我尝试过的那些没有帮助并导致同样错误的事情:

$ go clean -i -x -cache -modcache
$ chmod 755 go/pkg/windows_amd64/aceslib.a
$ go get
build ace: cannot load aceslib: cannot find module providing package aceslib
$ rm -rf go/pkg/*

目录结构和包名有点不一致——它应该是指向项目repo的URL,就像其他不是从stdlib导入的内容一样。如果您没有回购协议,并且希望使用本地参考,则需要向
ace/go.mod
添加
replace
指令,如下所示:

replace aceslib => ../aceslib

如文件所述。

IIRC,没有目录的包名是为stdlib包保留的。因此,您应该首先将源代码树向下推至少一个级别,以便可以通过“dir/package”访问它

接下来,您真的想将这些包作为单独的模块来处理吗?ace和aceslib包下有单独的mod文件。您可以将它们组合在一个模块下,并在项目根目录下使用一个go.mod,从而使您的生活更加轻松。这样你就不需要重定向,等等

您还必须包括模块及其目录:

import lib "dir/aceslib"

ace和aces客户端共享结构和一些功能,这就是分开的原因是的,但不需要将它们分开。它们仍然可以是单个模块下的独立包。