如何在本地复制 goreleaser 运行?

问题描述 投票:0回答:2

上下文:有一个 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 似乎是相关的。

go static-linking goreleaser
2个回答
0
投票

在 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
,因为您可能不想每次都重新发布工件。


0
投票

似乎 它与 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
© www.soinside.com 2019 - 2024. All rights reserved.