概述
在做 drone
插件时,发现了一个库drone-dingtalk-message 在使用 goreleaser 编译时只用了ldflags
指令,于是了解了一下
编译时加入自定义信息到程序中
main路径下
通常情况下,我们直接使用go build
来编译程序,要想加入自定义信息到程序中,很简单,编译时使用-ldflags
就行。
例如有如下程序test.go:
package main
import "fmt"
var AAA string
var BBB string
func main() {
fmt.Println("AAA =", AAA)
fmt.Println("BBB =", BBB)
}
在编译时加入-ldflags:
go build -ldflags "-X 'main.AAA=111' -X 'main.BBB=222'"
运行程序:
./test
AAA = 111
BBB = 222
可以看到AAA和BBB两个变量的值变成了111和222,也就是在编译时加入的信息。
文档中可以看到相关参数的说明:
hdr-Compile_packages_and_dependencies
-ldflags '[pattern=]arg list'
arguments to pass on each go tool link invocation.
-X importpath.name=value
Set the value of the string variable in importpath named name to value.
This is only effective if the variable is declared in the source code either uninitialized
or initialized to a constant string expression. -X will not work if the initializer makes
a function call or refers to other variables.
Note that before Go 1.5 this option took two separate arguments.
这里的importpath.name=value
可以理解为包名.变量名
,比如上面的main.AAA
就表示main包
下的AAA变量
。
- drone-plugin-notice drone 通知插件
非main路径
查找导入路径
对于不在 main
包下的变量,我们需要先知道其导入路径。此步骤可以通过 go tool nm
实现,完整示例如下:
go build -o pure
go tool nm pure | grep -i version
78a060 T crypto/tls.(*Config).mutualVersion
789e80 T crypto/tls.(*Config).supportedVersions
7986a0 T crypto/tls.(*Conn).pickTLSVersion
7af820 T crypto/tls.prfAndHashForVersion
daf320 D crypto/tls.supportedVersions
dbc950 D github.com/go-git/go-git/v5/plumbing/format/idxfile.ErrUnsupportedVersion
740840 T github.com/go-git/go-git/v5/plumbing/format/idxfile.readVersion
d6d360 D github.com/go-git/go-git/v5/plumbing/format/index.DecodeVersionSupported
d6d1ac D github.com/go-git/go-git/v5/plumbing/format/index.EncodeVersionSupported
dbc9a0 D github.com/go-git/go-git/v5/plumbing/format/index.ErrUnsupportedVersion
dba928 D github.com/go-git/go-git/v5/plumbing/format/packfile.ErrUnsupportedVersion
5b68c0 T github.com/spf13/cobra.(*Command).InitDefaultVersionFlag
5b20e0 T github.com/spf13/cobra.(*Command).SetVersionTemplate
5b2e60 T github.com/spf13/cobra.(*Command).VersionTemplate
89d620 T golang.org/x/crypto/ssh.(*Client).ClientVersion
89dea0 T golang.org/x/crypto/ssh.(*Client).ServerVersion
89b840 T golang.org/x/crypto/ssh.(*connection).ClientVersion
89b940 T golang.org/x/crypto/ssh.(*connection).ServerVersion
878da0 T golang.org/x/crypto/ssh.(*sshConn).ClientVersion
878e60 T golang.org/x/crypto/ssh.(*sshConn).ServerVersion
89d6c0 T golang.org/x/crypto/ssh.Client.ClientVersion
89df40 T golang.org/x/crypto/ssh.Client.ServerVersion
898520 T golang.org/x/crypto/ssh.exchangeVersions
893e00 T golang.org/x/crypto/ssh.isBrokenOpenSSHVersion
898720 T golang.org/x/crypto/ssh.readVersion
dbb090 D golang.org/x/sys/windows.procGetVersion
dbb338 D golang.org/x/sys/windows.procRtlGetNtVersionNumbers
dbb340 D golang.org/x/sys/windows.procRtlGetVersion
812200 T net/http.ParseHTTPVersion
dbd900 D pure-admin-cli/cmd.templateVersion
daee20 D pure-admin-cli/cmd.version
daee40 D pure-admin-cli/constants.DefaultVersion
daeed0 D runtime.buildVersion
e02a00 D runtime.processorVersionInfo
dbbd50 D syscall.procGetVersion
根据查找的信息可知,import path 为 pure-admin-cli/cmd.version
下面就可以更新此路径下的变量了
再次编译
go build -o pure -ldflags "-s -w -X pure-admin-cli/cmd.version=1.0.0-beta.0"
./pure -v
pure version 1.0.0-beta.0
- pure-admin-cli 用于快速构建基于vue-pure-admin项目的命令行工具