根据使用 rules_go 和 CGO 构建的 Bazel 的 godror 从您的应用程序或服务访问 Oracle

Depending on godror from Bazel builds with rules_go and CGO to access Oracle from your app or service

这是我找到答案的问题。我将它添加到 SO 中,因为它可能对其他人有用。如果有更好的回复我会很乐意采纳!

我正在构建一些需要与 Oracle 通信的 Go 服务,使用 Bazel 作为构建系统并结合官方 rules_go。最好的库似乎是 godror,但是当尝试依赖它时,构建失败并显示:

external/com_github_godror_godror/conn.go:10:10: fatal error: 'dpiImpl.h' file not found
#include "dpiImpl.h"

seems to be due 事实上 gazelle 并没有复制 CGO 在通过 go build 调用时开箱即用的所有 magic/implicit 事情,我是想知道 if/how 有一种方法可以使用 Bazel 正确构建该库。

由于似乎没有适合 Oracle 的独立 Go 客户端,唯一的出路是让它与 CGO 一起工作。

在对生成的 BUILD.bazel 文件进行了一些尝试之后,我发现了一个似乎至少在表面上有效的解决方法 [1][2]。它涉及从子目录添加 C 源代码和头文件,以及修补 C 文件。

有关详细信息,请参阅此 gist

请注意,不修补 C 文件(并在 go_library 定义中包含相关的 dpi.c 文件)将导致构建失败并伴随以下情况:

duplicate symbol '_dpiVar_getReturnedData' in:
    /var/folders/8y/pztgykk94_q4j7fnmjhnbnw0001t4q/T/rules_go_work-940074786/_x3.o
    /var/folders/8y/pztgykk94_q4j7fnmjhnbnw0001t4q/T/rules_go_work-940074786/_x43.o
ld: 1164 duplicate symbols for architecture x86_64

这里我猜想通过 go build 发生的一些 CGO 魔术需要用适当的标志替换,但至少事情与替换一起工作。

根据记录,探索主要是在 OS X 上完成的,而使用在 Linux 盒子上构建的二进制文件进行测试。

对于任何对 godror 细节感兴趣的人,这里是 relevant issue

[1]:如适用于基本查询但尚未在生产环境中尝试所有功能,所以 YMMV。

[2]:奇怪的是,解决方法使得无法 go install 来源。如果 C/CGO 专家有线索,我很想知道为什么 – 哦,顺便说一句,我是一个 C/CGO 新手,如果问题很明显,我很抱歉。