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

时间:2019-09-11 17:26:22

标签: go packaging go-modules

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

aceslib中的所有go文件都共享软件包名称aceslib。我将import lib "aceslib"包含在ace和aces-client中。我可以使用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/*

2 个答案:

答案 0 :(得分:0)

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

replace aceslib => ../aceslib

in the Modules docs所述。

答案 1 :(得分:0)

IIRC,不带目录的软件包名称保留给stdlib软件包。因此,您应该首先将源代码树至少下推一个级别,以便可以通过“ dir / package”进行访问。

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

您还必须将模块及其目录包括在内

<intent-filter>
  <action android:name="android.intent.action.MAIN"/>
  <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data
    android:scheme="https"
    android:host="siara.cc"
    android:pathPrefix="/CrossCalc"/>
</intent-filter>