【问题标题】:Go library: cannot find module providing package libGo 库:找不到提供包库的模块
【发布时间】:2019-09-12 02:13:29
【问题描述】:

我正在创建 3 个单独的 go 项目:aceaces-client 和两个项目共享的库 aceslib。根据 go-documentation (https://golang.org/doc/code.html#Library),我无法包含共享库

aceslib 中的所有 go 文件共享包名 aceslib。我在 ace 和 ace-client 中包含import lib "aceslib" 中的库。我可以使用go build 构建库,并使用go install 安装它,在目录列表中可以看到文件go/pkg/windows_amd64/aceslib.a 已创建。

但是当我尝试构建 aceace-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/*

【问题讨论】:

    标签: go packaging go-modules


    【解决方案1】:

    目录结构和包名称有点偏离 - 它应该是项目存储库的 URL,就像不是来自 stdlib 的所有其他导入一样。如果您没有 repo 并且想要使用本地引用,则需要向 ace/go.mod 添加一个 replace 指令,如下所示:

    replace aceslib => ../aceslib
    

    如文档所述in the Modules docs

    【讨论】:

      【解决方案2】:

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

      接下来,您真的要将这些包视为单独的模块吗?您在 ace 和 aceslib 包下有单独的 mod 文件。您可以将它们与项目根目录中的单个 go.mod 组合在一个模块下,让自己的生活更轻松。这样你就不需要重定向等。

      您还必须在其目录中包含模块:

      import lib "dir/aceslib"
      

      【讨论】:

      • ace 和 ace-client 共享结构和一些功能,这就是分离的原因
      • 是的,但您不需要将它们设为单独的模块。它们仍然可以是单个模块下的单独包。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2019-05-21
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2021-09-21
      相关资源
      最近更新 更多