Heim >Backend-Entwicklung >Golang >Behalten Sie beim Bearbeiten einfache Anführungszeichen in YAML-Dateien bei

Behalten Sie beim Bearbeiten einfache Anführungszeichen in YAML-Dateien bei

PHPz
PHPznach vorne
2024-02-12 12:03:08468Durchsuche

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

Einführung in die Banane des PHP-Editors: Bei der Bearbeitung ist die Beibehaltung einfacher Anführungszeichen eine wichtige Fähigkeit. In YAML-Dateien stellt die Verwendung von einfachen Anführungszeichen sicher, dass der Textinhalt intakt bleibt und nicht vom Parser interpretiert wird. Mit dieser Methode können Fehler bei Sonderzeichen oder Daten in bestimmten Formaten vermieden und die Richtigkeit und Vollständigkeit des Dateiinhalts sichergestellt werden. Unabhängig davon, ob Sie mit Konfigurationsdateien arbeiten oder Code schreiben, ist die Verwendung von einfachen Anführungszeichen eine gute Angewohnheit und kann uns dabei helfen, den Code besser zu verwalten und zu pflegen.

Frageninhalt

Ich möchte die Werte bestimmter Schlüssel in einer YAML-Datei bearbeiten, während der Rest unverändert bleibt. Ich habe einen Ausschnitt geschrieben, um einige Werte für diese Schlüssel einzufügen, aber die neu generierte Datei enthält keine einfachen Anführungszeichen ('). Wie kann man diese Situation vermeiden?

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

Meine Struktur:

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

Archivieren Sie Yaml vor der Bearbeitung

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

Archivieren Sie Yaml nach der Bearbeitung

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

Wie Sie sehen können, sind die einfachen Anführungszeichen verschwunden. Irgendwelche Vorschläge?

Workaround

yaml.Unmarshal Funktion unmarshallt yaml-Werte in benutzerdefinierte Strukturen ohne Metadaten (style, kind) > usw.). yaml.Marshal Die Funktion verarbeitet die benutzerdefinierte Struktur und setzt den Metadatenwert auf den Standardwert. Um auf Metadatenfelder zuzugreifen, verwenden Sie yaml.Node$ $endc$$5db79b134e9f6b82c0b36e0489ee08ed. 94b3e26ee717c64999d7867364b1b4a3 e388a4556c0f65e1904146cc1a846beeIn Ihrem Fall hat das Feld <code>Value 字段具有 yaml.Style 等于 yaml.SingleQuotedStyleValue

yaml.Style

ist gleich Value 字段类型更改为 yaml.Nodeyaml.SingleQuotedStyle

Um darauf zuzugreifen (und es nach dem Unmarshalling nicht zu verlieren), ändern Sie den Feldtyp

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

🎜Spielplatz🎜🎜🎜

Das obige ist der detaillierte Inhalt vonBehalten Sie beim Bearbeiten einfache Anführungszeichen in YAML-Dateien bei. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen