猿问

如何更新 Go 模板,同时仍然保留原始模板变量

这是一个高级问题,因为我不确定如何解决这个问题:

我正在构建一个 CLI,自动为用户设置代码项目。

我想创建一个update功能,允许用户更新到最新的 CLI 模板版本,但仍然保留他们用于创建项目的原始变量(即项目名称、环境变量等...)

我知道如何创建新模板,但我不知道如何更新并仍然保留用户传递的变量。

它类似于 git merge,因此将用户的本地项目与更新的 CLI 模板合并。

var deploymentYamlData在下面的代码中,您可以看到如何使用字符串变量对文件进行模板化的示例

我有一个函数可以将所有这些文件模板组织到项目的正确目录结构中。

我将如何将目录模板与用户的本地目录合并,同时能够保留原始模板变量?

如果我需要澄清更多,请提前道歉。

package main


import (

    "text/template"

        "os"

)


var deploymentYamlData = `---


  # do not edit commented lines

  # CLI-Version: {{ .GitTagVersion}}


  app: {{ .BotName }}

  type: web

  team: {{ .TeamName }}

  docker_image: {{ .DockerImageName }}

  docker_tag: {{ .TagVersion }}

  internal: false

  replicas: {{ .Replicas }}

  revisionHistoryLimit: 5

  container_port: {{ .DockerImagePort }}

   healthcheck:

    path: /{{ .DockerImageHealthCheck }}

  dynamodb:

    enable_deleteitem: true

    tables:

      - name: {{ .BotName }}_conversation_data

`


type DigitalAssistant struct {

    BotName string

    TeamName string

    DockerImageName string

    TagVersion string

    Replicas int

    DockerImagePort int

    DockerImageHealthCheck string

        GitTageVersion string


}


func main() {

    bot := DigitalAssistant{"bobisyouruncle", "teamAwesome", "awesomebotimagename", "0.1.0", 1, 8000, "health"}

    bmap, err := template.New("captain.tmpl").Parse(deploymentYamlData)

    if err != nil { panic(err) }

    err = bmap.Execute(os.Stdout, bot)

    if err != nil { panic(err) }

}


不负相思意
浏览 132回答 0
0回答

浮云间

有多种方法可以解决此问题,但如果您使用https://github.com/go-yaml/yaml等模块生成和读取 YAML ,而不是使用模板,则此往返会更容易。此外,该工具还可以通过示例轻松创建结构类型: https: //mengzhuo.github.io/yaml-to-go/https://github.com/spf13/viper中采用了不同的解析方法,如果您允许您不知道的字段,这可能会更有用。
随时随地看视频慕课网APP

相关分类

Go
我要回答