上下文:有一个 repo 使用 GoReleaser 工具 编译二进制文件并 releases 它到 GitHub.
如 this issue 中所述,标记为
v1.32.0
的提交导致发布了动态链接的二进制文件——这没关系:例如,如果您 download terraform-provider-confluent_1.32.0_linux_amd64
二进制文件,然后运行 file
命令会看到“动态链接”:
$ file ~/MyDownloads/terraform-provider-confluent_1.32.0_linux_amd64/terraform-provider-confluent_1.32.0
/Users/klinou/MyDownloads/terraform-provider-confluent_1.32.0_linux_amd64/terraform-provider-confluent_1.32.0: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=8SfNWb1Abn_y718BUN-I/PH1ZOJTKh7G-G89wQMVi/7pnMTwFFJzGpJwJM40fD/vwMzK5ZvGUHoFFCvKApk, stripped
我一直在尝试更新 .goreleaser 配置以生成静态链接的二进制文件。但问题是在本地运行 GoReleaser 工具 时,我什至无法重现“动态链接”消息:
$ git clone https://github.com/confluentinc/terraform-provider-confluent.git
$ cd terraform-provider-confluent
$ git checkout v1.32.0
$ git log --pretty=oneline | head -n 2
77e1ff645b2beb7c723d72e8a3a45404a86540ab chore: minor version bump v1.32.0
8794b8e9db91abc0386463824349dbbdca406917 #minor Prepare for 1.32.0 release (#382)
$ goreleaser build
• building...
• loading config file file=.goreleaser.yml
• loading environment variables
• getting and validating git state
• building... commit=77e1ff645b2beb7c723d72e8a3a45404a86540ab latest tag=v1.32.0
• parsing tag
...
• building binary=dist/terraform-provider-confluent-internal_freebsd_arm_6/terraform-provider-confluent-internal_1.32.0
• building binary=dist/terraform-provider-confluent-internal_windows_arm_6/terraform-provider-confluent-internal_1.32.0.exe
• building binary=dist/terraform-provider-confluent-internal_linux_arm64/terraform-provider-confluent-internal_1.32.0
• building binary=dist/terraform-provider-confluent-internal_windows_arm64/terraform-provider-confluent-internal_1.32.0.exe
• storing release metadata
• writing file=dist/artifacts.json
• writing file=dist/metadata.json
• build succeeded after 185.72s
$ file dist/terraform-provider-confluent-internal_linux_amd64/terraform-provider-confluent-internal_1.32.0
dist/terraform-provider-confluent-internal_linux_amd64/terraform-provider-confluent-internal_1.32.0: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=mcIeopVb5rXUWUc_eSUS/j1Bzyx4mWzFzh_9rKrtG/KancpatKw1cE9IjTQJmA/t6Dl2Mx7-b1wnGTxHaMx, stripped
最后,对于
statically linked
命令,我可以看到 dynamically linked
而不是 file
。我应该修复什么(GoReleaser 命令?)以重现 GoReleaser 的“远程”运行以查看dynamically linked
?
更新:https://github.com/zambien/terraform-provider-apigee/issues/48 似乎是相关的。
在 v1.32.0 上,您在
CGO_ENABLED
中有一个错字,所以,事实上,没有为它设置值。
https://github.com/confluentinc/terraform-provider-confluent/blob/v1.32.0/.goreleaser.yml#L32
如果您在本地为同一操作系统
go build
而没有为CGO_ENABLED
设置任何值,则二进制文件将被动态链接,并且如果您为另一个GOOS
构建(比方说,从darwin
您设置GOOS=linux
) ,它将被静态链接。
所以,这与 GoReleaser 本身关系不大,更多的是与 Go 工具链和错字有关。
回答你的问题,如果你在你的GoReleaser的配置文件上设置
CGO_ENABLED=1
,你应该能够在本地复制它。不过,我建议使用 --skip-publish
,因为您可能不想每次都重新发布工件。
似乎 它与 golang 有关,与 GoReleaser 工具无关。我在运行它时设法重现了它
alpine:latest
:
/terraform-provider-confluent # GOOS=linux GOEXPERIMENT=boringcrypto GO_ENABLEDC=1 GO111MODULE=on go build -mod=vendor -o ./bin/test
/terraform-provider-confluent # file bin/test
bin/test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, Go BuildID=fhj6Ss4N5d_ykkAthq4k/V5mMr10YkNseYsALvX59/LCV_yXtocvQbKjlFWnVk/amlBkYDQQEWLeECvcQxy, with debug_info, not stripped