为了账号安全,请及时绑定邮箱和手机立即绑定

如果编译器只是一个太旧的点发布,有没有办法让 Golang 编译失败?

如果编译器只是一个太旧的点发布,有没有办法让 Golang 编译失败?

Go
倚天杖 2021-11-29 16:22:36
具体来说,对于我们的下一个软件版本,我想确保捕获在 go 1.5.2 中发布的错误修复;如果我们的构建服务器尝试使用 Go 1.5.1 或更早版本构建我的代码,有没有办法使构建失败?我知道构建约束,我可以看到如何添加“go1.5”的构建约束以确保使用“1.5 或更高”编译器,但“go1.5.2”不起作用(似乎未定义构建标记 go1.5.1 和 go1.5.2。)在相关说明中,我也找不到一种方法来转储适用于构建的构建标签,但这似乎是一件非常有用的事情。
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

您可以使用-ldflags传递配置的 min golang 构建并在 init() 时间检查运行时是否与指定版本匹配。


package main


import "runtime"


// go run -ldflags "-X main.minGoVersion=go1.5.1" main.go


// from http://stackoverflow.com/questions/18409373/how-to-compare-two-version-number-strings-in-golang

func VersionOrdinal(version string) string {

    // ISO/IEC 14651:2011

    const maxByte = 1<<8 - 1

    vo := make([]byte, 0, len(version)+8)

    j := -1

    for i := 0; i < len(version); i++ {

        b := version[i]

        if '0' > b || b > '9' {

            vo = append(vo, b)

            j = -1

            continue

        }

        if j == -1 {

            vo = append(vo, 0x00)

            j = len(vo) - 1

        }

        if vo[j] == 1 && vo[j+1] == '0' {

            vo[j+1] = b

            continue

        }

        if vo[j]+1 > maxByte {

            panic("VersionOrdinal: invalid version")

        }

        vo = append(vo, b)

        vo[j]++

    }

    return string(vo)

}


var minGoVersion string


func init() {

    if minGoVersion == "" {

        panic("please pass  -ldflags \"-X main.minGoVersion=<version string> flag\"")

    }


    current := VersionOrdinal(runtime.Version())

    desired := VersionOrdinal(minGoVersion)

    if current < desired {

        panic("unsupported golang runtime " + current + " < " + desired)

    }

}


func main() {


}



查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信