我可以传递构建命令标志并读取内部代码吗?

时间:2015-05-24 19:11:26

标签: go

我希望在init函数中执行这两行中的一行

func init() {
    log.SetPrefix(">>>>>>>>>>>>>   ")


    log.SetOutput(ioutil.Discard)
}

如何在make文件中实现与C和宏定义类似的内容? 我像go build my_project一样构建go程序,我没有任何自定义make文件。我可以传递构建命令标志并读取内部代码吗?

1 个答案:

答案 0 :(得分:6)

创建一个可以测试的字符串变量。然后使用传递给链接器的-X设置该字符串变量。例如:

package main

var MODE string

func main() {
    if MODE == "PROD" {
        println("I'm in prod mode")
    } else {
        println("I'm NOT in prod mode")
    }

}

现在,如果仅使用go build构建此代码,MODE将为""。但你也可以用这种方式构建它:

go build -ldflags "-X main.MODE PROD"

现在MODE将是"PROD"。您可以使用它来根据构建设置修改逻辑。我通常使用这种技术在二进制文件中设置版本号;但它可以用于各种构建时配置。请注意,它只能设置字符串。所以你不能使MODE成为一个bool或整数。

您也可以使用标签来实现这一点,标签设置稍微复杂一些,但功能更强大。创建三个文件:

main.go

package main

func main() {
    doThing()
}

main_prod.go

// +build prod

package main

func doThing() {
    println("I'm in prod mode")
}

main_devel.go

// +build !prod

package main

func doThing() {
    println("I'm NOT in prod mode")
}

现在,当您使用go build进行构建时,您将获得main_devel.go版本(文件名无关紧要;只有顶部的// +build !prod行)。但是,您可以通过使用go build -tags prod构建生产版本。

请参阅build文档中的构建约束部分。