卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35443本站已运行396

编辑时在 YAML 文件中保留单引号

编辑时在 yaml 文件中保留单引号

php小编香蕉介绍:在进行编辑时,保留单引号是一个重要的技巧。在YAML文件中,使用单引号可以确保文本内容被原样保留,不会受到解析器的解释。这种方式可以避免特殊字符或者特定格式的数据出现错误,确保文件内容的准确性和完整性。无论是处理配置文件还是编写代码,保留单引号都是一个很好的习惯,能够帮助我们更好地管理和维护代码。

问题内容

我想编辑 YAML 文件中某些键的值,同时保持其余键不变。我编写了一个片段来为这些键插入一些值,但生成的新文件不维护单引号 (')。如何避免这种情况?

我的代码:

func updateVariables(nameValue, nameCluster string) error {
    
    yamlFile, err := os.ReadFile("path")
    if err != nil {
        return fmt.Errorf("Error reading YAML file: %v", err)
    }

    var config PipelineConfig

    err = yaml.Unmarshal(yamlFile, &config)
    if err != nil {
        return fmt.Errorf("Error parsing YAML file: %v", err)
    }

    for i := range config.Variables {
        switch config.Variables[i].Name {
        case "app_name":
            config.Variables[i].Value = nameValue
        case "cluster_name":
            config.Variables[i].Value = nameCluster

        }
    }

    modifiedYAML, err := yaml.Marshal(&config,)
    if err != nil {
        return fmt.Errorf("Error converting structure to YAML: %v", err)
    }

    err = os.WriteFile("path", modifiedYAML, 0644)
    if err != nil {
        return fmt.Errorf("Error writing modified YAML file: %v", err)
    }
    fmt.Println("File YAML modified.")
    return nil
}

我的结构:

type PipelineConfig struct {
    Trigger   string `yaml:"trigger"`
    Variables []struct {
        Name  string `yaml:"name"`
        Value string `yaml:"value"`
    } `yaml:"variables"`
    
    Stages []struct {
        Template   string `yaml:"template"`
        Parameters struct {
            AppName       string `yaml:"app_name"`
            AppRepoBranch string `yaml:"app_repo_branch"`
            LocationEnv   string `yaml:"location_env"`
            ComponentName string `yaml:"component_name"`
            ClusterName   string `yaml:"cluster_name"`
        } `yaml:"parameters"`
    } `yaml:"stages"`
}

编辑前归档 yaml

trigger: none

variables:
  - name: app_name
    value: '<name>'
  - name: cluster_name
    value: '<cluster>'
  - name: component_name
    value: '<component>'
  - name: location_env
    value: 'dev'


stages:
  - template: 'tem'
    parameters:
      app_name: '${{ variables.app_name }}'
      app_repo_branch: 'dev'
      location_env: '${{ variables.location_env }}'
      component_name: '${{ variables.component_name }}'
      cluster_name: '${{ variables.cluster_name }}'

编辑后归档yaml

trigger: none
variables:
    - name: app_name
      value: test
    - name: cluster_name
      value: test
    - name: component_name
      value: <component>
    - name: location_env
      value: dev

stages:
    - template: tem
      parameters:
        app_name: ${{ variables.app_name }}
        app_repo_branch: develop
        location_env: ${{ variables.location_env }}
        component_name: ${{ variables.component_name }}
        cluster_name: ${{ variables.cluster_name }}

如您所见,单引号消失了。有什么建议吗?

解决方法

yaml.Unmarshal 函数将 yaml 值解组到不带元数据的自定义结构(stylekind 等)。 yaml.Marshal 函数正在处理自定义结构,将元数据值设置为默认值。要访问元数据的字段,需要使用 yaml.Node$ $endc$$。

在您的情况下 Value 字段具有 yaml.Style 等于 yaml.SingleQuotedStyle

要访问它(解组后不要丢失),请将 Value 字段类型更改为 yaml.Node


Variables []struct {
    Name  string    `yaml:"name"`
    Value yaml.Node `yaml:"value"`
} `yaml:"variables"`
for i := range config.Variables {
    switch config.Variables[i].Name.Value {
    case "app_name":
        config.Variables[i].Value.Value = nameValue
    case "cluster_name":
        config.Variables[i].Value.Value = nameCluster
    }
}

游乐场

卓越飞翔博客
上一篇: golang中如何处理空值?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码: