是否可以在每次编译Go应用程序时自动增加次要版本号?
我想在我的程序中设置一个版本号,使用一个自动递增的部分:
$ myapp -version
MyApp version 0.5.132
0.5是我设置的版本号,132是每次编译二进制文件时自动递增的值。
这在围棋中可能吗?
是否可以在每次编译Go应用程序时自动增加次要版本号?
我想在我的程序中设置一个版本号,使用一个自动递增的部分:
$ myapp -version
MyApp version 0.5.132
0.5是我设置的版本号,132是每次编译二进制文件时自动递增的值。
这在围棋中可能吗?
当前回答
在构建混合命令行应用程序和库项目时,我在使用-ldflags参数时遇到了麻烦,所以我最终使用Makefile目标生成一个包含应用程序版本和构建日期的Go源文件:
BUILD_DATE := `date +%Y-%m-%d\ %H:%M`
VERSIONFILE := cmd/myapp/version.go
gensrc:
rm -f $(VERSIONFILE)
@echo "package main" > $(VERSIONFILE)
@echo "const (" >> $(VERSIONFILE)
@echo " VERSION = \"1.0\"" >> $(VERSIONFILE)
@echo " BUILD_DATE = \"$(BUILD_DATE)\"" >> $(VERSIONFILE)
@echo ")" >> $(VERSIONFILE)
在我的init()方法中,我这样做:
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "%s version %s\n", os.Args[0], VERSION)
fmt.Fprintf(os.Stderr, "built %s\n", BUILD_DATE)
fmt.Fprintln(os.Stderr, "usage:")
flag.PrintDefaults()
}
但是,如果您想要一个原子递增的构建号而不是构建日期,则可能需要创建一个包含最后一个构建号的本地文件。Makefile会将文件内容读入一个变量,增加它,然后将它插入到版本中。转到文件而不是日期,并将新的构建号写回文件。
其他回答
使用多个-ldflags:
$ go build -ldflags "-X name1=value1 -X name2=value2" -o path/to/output
使用ldflags设置主包中的变量:
使用文件main.go:
package main
import "fmt"
var (
version string
build string
)
func main() {
fmt.Println("version=", version)
fmt.Println("build=", build)
}
然后运行:
go run \
-ldflags "-X main.version=1.0.0 -X main.build=12082019" \
main.go
构建:
go build -o mybinary \
-ldflags "-X main.version=1.0.0 -X 'main.build=$(date)'" \
main.go
使用ldflags在非主包中设置变量:
使用config.go文件:
package config
import "fmt"
var (
Version string
)
func LogVersion() {
fmt.Println("version=", Version)
}
你还需要文件main.go:
package main
import (
"fmt"
"github.com/user/repo/config"
}
func main() {
config.LogVersion()
}
首先构建二进制文件:
go build -o mybinary main.go
找到要设置的变量名的完整路径:
go tool nm <path_to_binary> | grep Version
运行并重新构建二进制文件,但是使用ldflags:
go run \
-ldflags "-X github.com/user/repo/config.Version=1.0.0" \
main.go --version
go build -o mybinary \
-ldflags "-X github.com/user/repo/config.Version=1.0.0" \
main.go
灵感来自https://github.com/golang/go/wiki/GcToolchainTricks#including-build-information-in-the-executable
如果你正在使用goreleaser,请阅读https://goreleaser.com/environment/#using-the-mainversion:
默认的GoReleaser设置了三个ldflags: 主要。version:当前Git标签 main.commit:当前git提交SHA 主要。日期:根据RFC3339的日期
如果您想查看实际操作,请访问https://github.com/hoto/fuzzy-repo-finder/blob/master/pkg/config/config.go
Go链接器(Go工具链接)有一个选项来设置一个未初始化的字符串变量的值:
- x importpath.name =值 将importpath named name中的字符串变量的值设置为
价值。 注意,在Go 1.5之前,这个选项有两个单独的参数。 现在它接受一个参数在第一个=号上分裂。
作为构建过程的一部分,您可以使用它设置版本字符串变量。您可以使用-ldflags将其传递给go工具。例如,给定以下源文件:
package main
import "fmt"
var xyz string
func main() {
fmt.Println(xyz)
}
然后:
$ go run -ldflags "-X main.xyz=abc" main.go
abc
以定主。在构建时修改构建日期和时间:
go build -ldflags "-X main.minversion=`date -u +.%Y%m%d.%H%M%S`" service.go
如果编译时没有初始化main。以这种方式Minversion,它将包含空字符串。
在Windows操作系统上给出下面的程序
package main
import "fmt"
var (
version string
date string
)
func main() {
fmt.Printf("version=%s, date=%s", version, date)
}
您可以使用
go build -ldflags "-X main.version=0.0.1 -X main.date=%date:~10,4%-%date:~4,2%-%date:~7,2%T%time:~0,2%:%time:~3,2%:%time:~6,2%"
日期格式假设您的环境回声% Date %是Fri 07/22/2016,回声%time%是16:21:52.88
那么输出将是:version=0.0.1, date=2016-07-22T16:21:52
在构建混合命令行应用程序和库项目时,我在使用-ldflags参数时遇到了麻烦,所以我最终使用Makefile目标生成一个包含应用程序版本和构建日期的Go源文件:
BUILD_DATE := `date +%Y-%m-%d\ %H:%M`
VERSIONFILE := cmd/myapp/version.go
gensrc:
rm -f $(VERSIONFILE)
@echo "package main" > $(VERSIONFILE)
@echo "const (" >> $(VERSIONFILE)
@echo " VERSION = \"1.0\"" >> $(VERSIONFILE)
@echo " BUILD_DATE = \"$(BUILD_DATE)\"" >> $(VERSIONFILE)
@echo ")" >> $(VERSIONFILE)
在我的init()方法中,我这样做:
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "%s version %s\n", os.Args[0], VERSION)
fmt.Fprintf(os.Stderr, "built %s\n", BUILD_DATE)
fmt.Fprintln(os.Stderr, "usage:")
flag.PrintDefaults()
}
但是,如果您想要一个原子递增的构建号而不是构建日期,则可能需要创建一个包含最后一个构建号的本地文件。Makefile会将文件内容读入一个变量,增加它,然后将它插入到版本中。转到文件而不是日期,并将新的构建号写回文件。