【问题标题】:Cross-compiling Golang in Bitbucket Pipelines在 Bitbucket 管道中交叉编译 Golang
【发布时间】:2017-06-22 21:54:42
【问题描述】:

我正在尝试将 Bitbucket Pipelines 配置为自动将 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 代码,因为它正在访问 Unix/Linux 服务,所以配置为不在 Windows 上构建,正如 github.com/sirupsen/logrus/blob/master/hooks/syslog/syslog.go 顶部的特殊注释(构建标签)所示。答案中的稍长版本即将发布。
  • (所以这不是管道问题等。您需要确保实际代码在 Windows 上构建时仅引用适用于 Windows 的包。)

标签: go cross-compiling bitbucket-pipelines


【解决方案1】:

syslog 是特定于平台的服务,因此the Logrus syslog hook code 有一个特殊的注释,称为build tag,用于 告诉 Go 工具不要在 Windows(或 Native Client 或 Plan9)上构建它:

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

除非您不想在 Linux 上集成 syslog,否则您可能希望将当前始终导入 hooks/syslog 的应用程序代码分叉为两个版本,一个用于具有 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.

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 2023-03-13
    • 2023-02-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2014-01-09
    相关资源
    最近更新 更多