Maison >développement back-end >Golang >Conserver les guillemets simples dans les fichiers YAML lors de la modification

Conserver les guillemets simples dans les fichiers YAML lors de la modification

PHPz
PHPzavant
2024-02-12 12:03:08468parcourir

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

introduction à la banane de l'éditeur php : lors de l'édition, conserver les guillemets simples est une compétence importante. Dans les fichiers YAML, l'utilisation de guillemets simples garantit que le contenu du texte est conservé intact et ne sera pas interprété par l'analyseur. Cette méthode peut éviter les erreurs dans les caractères spéciaux ou les données dans un format spécifique et garantir l'exactitude et l'exhaustivité du contenu du fichier. Que vous traitiez de fichiers de configuration ou que vous écriviez du code, conserver des guillemets simples est une bonne habitude et peut nous aider à mieux gérer et maintenir le code.

Contenu de la question

Je souhaite modifier les valeurs de certaines clés dans un fichier YAML tout en gardant le reste inchangé. J'ai écrit un extrait pour insérer quelques valeurs pour ces clés, mais le nouveau fichier généré ne conserve pas de guillemets simples ('). Comment éviter cette situation ?

Mon code :

<code>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
}
</code>

Ma structure :

<code>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"`
}
</code>

Archiver yaml avant de le modifier

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 }}'

Archiver yaml après édition

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 }}

Comme vous pouvez le constater, les guillemets simples ont disparu. Aucune suggestion? La fonction

Workaround

yaml.Unmarshal désorganise les valeurs yaml dans des structures personnalisées sans métadonnées (style, kind) >, etc.). yaml.Marshal La fonction traite la structure personnalisée, en définissant la valeur des métadonnées sur la valeur par défaut. Pour accéder aux champs de métadonnées, utilisez yaml.Node$ $endc$$5db79b134e9f6b82c0b36e0489ee08ed. 94b3e26ee717c64999d7867364b1b4a3 e388a4556c0f65e1904146cc1a846beeDans votre cas, le champ <code>Value 字段具有 yaml.Style 等于 yaml.SingleQuotedStyleValue a

yaml.Style

est égal à Value 字段类型更改为 yaml.Nodeyaml.SingleQuotedStyle

Pour y accéder (et ne pas le perdre après le démarchage), changez le type de champ

Value en 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
    }
}

🎜Aire de jeux🎜🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer