在 Bitbucket 管道中交叉编译 Golang

Cross-compiling Golang in Bitbucket Pipelines

我正在尝试将 Bitbucket 管道配置为自动将 Golang 代码编译为 Linux、OSX 和 Windows。我为此使用了 Go 的交叉编译功能;管道是 运行 一个 Linux 环境,并通过设置 GOOS 和 GOARCH 的值交叉编译为 OSX 和 Windows。但是,我无法让 Windows 构建工作 - 它出错并告诉我它找不到某个包。 Linux 和 OSX 构建都成功了。但是,Windows 构建失败,告诉我找不到 /go/src/github.com/sirupsen/logrus/hooks/syslog。之前的两个构建都成功地使用了这个包,运行

ls /go/src/github.com/sirupsen/logrus/hooks/syslog
ls ${GOPATH}/src/github.com/sirupsen/logrus/hooks/syslog

构建命令之前的行显示该文件夹中有两个 Go 文件。我怀疑 windows 文件系统试图与 Linux 文件系统通信可能有问题?我花了几个小时搜索和试验,但似乎无法解决问题。

syslog 是特定于平台的服务,因此 the Logrus syslog hook code has a special comment, called a build tag,以 告诉 Go 工具不要在 Windows(或 Native Client 或 Plan9)上构建它:

// +build !windows,!nacl,!plan9

除非你甚至不想在 Linux 上集成 syslog,否则你可能想将当前总是导入 hooks/syslog 的应用程序代码分叉成两个版本,一个用于带有 syslog 的平台,一个用于那些没有。如果导入 hooks/syslog 的文件当前是 logconfig.go,您可以创建两个文件 logconfig_syslog.gologconfig_nosyslog.gosyslog 版本具有类似的约束上面,和 nosyslog 版本相反 (// +build windows,nacl,plan9).

Dave Cheney wrote a bit more about build tags and the various flavors of Go conditional compilation.