首页 > 解决方案 > 如何使用语义版本构建 Go Module?

问题描述

以下是使用 git repo 设置新的最小 Go 模块项目、提交并使用带注释的语义版本标记对其进行标记的 bash 步骤:

mkdir gotest
cd gotest

git init

go mod init test.org/simple

cat <<EOT >> app.go
package main

import (
    "fmt"
    "runtime/debug"
)

func main() {
    fmt.Println("hello world")

    if bi, ok := debug.ReadBuildInfo(); ok {
        fmt.Printf("version=%v. sum=%v\n", bi.Main.Version, bi.Main.Sum)
    } else {
        fmt.Println("Failed to get build info")
    }
}
EOT

echo "simple" >> .gitignore

git add go.mod app.go .gitignore
git commit -am "initial commit"
git tag -am "initial semantic version" v0.1.0

快速验证它的标记是否正确:

git tag -n
git describe --dirty

构建并运行:

go build
./simple

这会产生:

hello world
version=(devel). sum=

我希望看到我标记存储库的语义版本。相反,我得到了虚拟占位符版本。怎么了?

标签: gitgosemantic-versioninggo-modules

解决方案


go命令不会查询版本控制以确定您的存储库是否是语义版本的原始签出(即https://golang.org/issue/29228)。

如果您使用其他模块作为主模块构建二进制文件,那么该go命令应该知道正在使用您的模块的哪个版本并将其嵌入到生成的二进制文件中:

go.mod

module example.com/other

require test.org/simple v0.1.0

go build test.org/simple && ./simple

推荐阅读