是否可以在每次编译Go应用程序时自动增加次要版本号?

我想在我的程序中设置一个版本号,使用一个自动递增的部分:

$ myapp -version
MyApp version 0.5.132

0.5是我设置的版本号,132是每次编译二进制文件时自动递增的值。

这在围棋中可能吗?


当前回答

在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

其他回答

在其他答案的基础上,在最近的go版本中,也可以向ELF段编写buildid语句——尽管在程序中不太容易读取。

我写了相同的值给两者,使用如下的东西:

BuildInfo:= "BUILD #x, branch @ rev built yymmdd hh:mm:ss"
// note the nested quotes "''" required to get a string with 
// spaces passed correctly to the underlying tool
ldFl := fmt.Sprintf("-X 'main.buildId=%s' -s -w '-buildid=%s'", BuildInfo, BuildInfo)
args := []string{
    "build",
    "-ldflags", ldFl,
    "-trimpath",
    "-gcflags", "-dwarf=false",
}
buildpath:="path/to/my/cmd"
args=append(args,buildpath)
buildCmd:=exec.Command("go", args...)

我使用mage,一个用go编写的构建工具。您不需要上面的额外标志,但我选择这些标志是从发布二进制文件中尽可能多地剥离信息。

(题外话:与Make相比,Mage需要更多的前期工作,但比基于Make的构建系统更容易扩展/维护-另外,你不必在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,它将包含空字符串。

在构建混合命令行应用程序和库项目时,我在使用-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

在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