Go库:找不到提供包库的模块
Go library: cannot find module providing package lib
我正在创建 3 个独立的 go 项目:ace
、aces-client
和两个项目共享的库 aceslib
。根据 go-documentation (https://golang.org/doc/code.html#Library)
,我在包含共享库时遇到了问题
aceslib 中的所有 go 文件共享包名 aceslib
。我将库包含在 ace 和 aces-client 中 import lib "aceslib"
。我可以使用 go build
构建库并使用 go install
安装它,在目录列表中可以看到文件 go/pkg/windows_amd64/aceslib.a
已创建。
但是当我尝试构建 ace
或 ace-client
时抱怨:
$ go build
build ace: cannot load aceslib: cannot find module providing package aceslib
我的设置:
$ 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/*
目录结构和包名有点不对 - 它应该是 URL 到你的项目的 repo,就像所有其他不是来自 stdlib 的导入一样。如果你没有 repo 并且想使用本地引用,你需要向 ace/go.mod
添加一个 replace
指令,如下所示:
replace aceslib => ../aceslib
如文档所述in the Modules docs。
IIRC,没有目录的包名称是为 stdlib 包保留的。因此,您应该首先将源代码树向下推至少一个级别,以便您可以通过 "dir/package".
访问它
接下来,您真的要将这些包视为单独的 mod 规则吗?您在 ace 和 aceslib 包下有单独的 mod 文件。您可以将它们组合在一个 module 下,并在项目根目录下使用一个 go.mod,让您的生活更轻松。这样你就不需要重定向等
您还必须包含 mod 规则及其目录:
import lib "dir/aceslib"
我正在创建 3 个独立的 go 项目:ace
、aces-client
和两个项目共享的库 aceslib
。根据 go-documentation (https://golang.org/doc/code.html#Library)
aceslib 中的所有 go 文件共享包名 aceslib
。我将库包含在 ace 和 aces-client 中 import lib "aceslib"
。我可以使用 go build
构建库并使用 go install
安装它,在目录列表中可以看到文件 go/pkg/windows_amd64/aceslib.a
已创建。
但是当我尝试构建 ace
或 ace-client
时抱怨:
$ go build
build ace: cannot load aceslib: cannot find module providing package aceslib
我的设置:
$ 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/*
目录结构和包名有点不对 - 它应该是 URL 到你的项目的 repo,就像所有其他不是来自 stdlib 的导入一样。如果你没有 repo 并且想使用本地引用,你需要向 ace/go.mod
添加一个 replace
指令,如下所示:
replace aceslib => ../aceslib
如文档所述in the Modules docs。
IIRC,没有目录的包名称是为 stdlib 包保留的。因此,您应该首先将源代码树向下推至少一个级别,以便您可以通过 "dir/package".
访问它接下来,您真的要将这些包视为单独的 mod 规则吗?您在 ace 和 aceslib 包下有单独的 mod 文件。您可以将它们组合在一个 module 下,并在项目根目录下使用一个 go.mod,让您的生活更轻松。这样你就不需要重定向等
您还必须包含 mod 规则及其目录:
import lib "dir/aceslib"