go

时间:2016-10-21 13:56:43

标签: go

例如我正在开发留言簿。它允许添加需要由主持人批准的记录。但是在开发更多功能时,批准每条记录都会很痛苦,这是在测试期间添加的。 那么,是否可以构建使用适当的标志集创建此类记录的应用程序的开发版本?

例如,使用以下功能编译prod构建:

func NewRecord() Record {
    return Record{Moderation: Awaiting}
}

在dev build中使用:

进行编译
func NewRecord() Record {
    return Record{Moderation: Approved}
}

我知道在前端,当你构建一些JS应用程序时,在构建生产时设置NODE_ENV =生产环境变量是一种常见的做法。 我在Go寻找类似的东西。 我看到两种方式,但不喜欢它们中的任何一种:

  1. 我可以在开发时设置Awaiting = Approved,然后在构建prod版本时将其更改回实际值。但是我害怕有一天我会忘记这个模拟,会把它变成回购或类似的东西。
  2. 将功能更改为

    func NewRecord() Record {
        if os.Getenv(mykey) == "production" {
                return Record{Moderation: Awaiting}
        } else {
                return Record{Moderation: Approved}
        }
    }
    

    但是我不喜欢在运行时为每个新记录评估这个条件。对于编译语言来说,这似乎是错误的。

  3. 作为奖励,如果这样的应用程序可以显示警告(对于stdout / stderr),如果它构建为开发版本,那将是很好的。

    感谢。

2 个答案:

答案 0 :(得分:5)

就我个人而言,我认为在您的示例中使用环境变量是“正确”的方法。这允许您在不重建应用程序的情况下调整行为,这在调试时可能非常有用。但是,如果您真的希望在编译时完成此操作,可以使用build constraints完成。

构建约束是一个位于文件顶部的特殊注释,表示“仅在满足特定条件时才构建此文件”。条件可以是我们正在构建的机器架构,我们正在运行的操作系统,或用户在构建时指定的自定义构建标签。

例如,您可以将功能调整为:

func NewRecord() Record {
    return Record{Moderation: ModLevel}
}

然后定义ModLevel两次,一次在文件modlevel_prod.go中,如下所示:

// +build !dev

package mypackage

const ModLevel = Awaiting

modlevel_dev.go中的一个(或者在这种情况下文件名无关紧要),如下所示:

// +build dev

package mypackage

const ModLevel = Approved

现在,在构建时,文件的生产版本是默认版本,如果要构建文件的开发版本,则必须明确包含构建标记:

$ go build -tags dev

答案 1 :(得分:2)

package initialization处评估表达式:

var defaultModeration int

func init() {
    if os.Getenv(mykey) == "production" {
        defaultModeration = Awaiting
    } else {
        defaultModeration = Approved
    }
}

func NewRecord() Record { return Record{Moderation: defaultModeration} }