我有一个 Go 包——称之为它——foo我围绕一些现有的 C 代码构建,我正在尝试确定如何最好地分发它。
一些背景知识......这是我的目录结构的简化版本:
foo/
|_ include/
|_ <several other header files>
|_ libs/
|_ <several .so files>
|_ foo.c
|_ foo.h
|_ foo.go
一个被剥光的头foo.go
package foo
// #cgo CFLAGS: -I${SRCDIR}/include
// #cgo LDFLAGS: ${SRCDIR}/_foo.so -L${SRCDIR}/libs
// #include <stdlib.h>
// #include "foo.h"
import "C"
...
_foo.so
作为构建过程的一部分生成的动态库在哪里。我能够很好地运行和测试我的代码,但我希望能够分发它并在一个单独的项目中使用它,一个使用go mod
. 这就是事情变得有点棘手的地方,我对 Go 的理解变得脆弱。从概念上讲,我只是希望能够将foo/
目录(.so
文件和所有)分发到另一个应用程序可以找到并导入它的地方,但是我遇到了几个绊脚石:
我不能把它变成一个二进制包,因为我们在 Go 1.13 上,据我所知,这个功能在 1.12 之后被删除了。
该.so
文件的构建过程非常庞大,我不希望其他开发人员不得不花费 30 分钟以上的时间来构建该对象。
我找到了很多 CGO 演示和博客,但没有很多关于如何分发 CGO 包的解释。有任何想法吗?
值得注意的是,这是针对我公司的,环境是标准的,所以我不必控制不同的操作系统等。
我忘了提到我尝试过的是将库烘焙到GOPATH
Docker 映像中,并从该基础构建依赖于它的微服务。但是,使用 构建服务时-mod=vendor
,无法在以下位置找到库GOPATH
:
RUN GOOS=linux \
GOARCH=amd64 \
CGO_ENABLED=1 \
GOFLAGS=-mod=vendor \
GO111MODULE=on \
go build \
-o service ./cmd/serve/main.go
./service
# build foo: cannot load foo: open /.../svc/vendor/foo: no such file or directory
森林海
相关分类