YAML: Benötige ich Anführungszeichen für Zeichenfolgen in YAML?


398

Ich versuche ein YAML-Wörterbuch für die Internationalisierung eines Rails-Projekts zu schreiben. Ich bin allerdings etwas verwirrt, da ich in einigen Dateien Zeichenfolgen in doppelten Anführungszeichen und in einigen ohne sehe. Einige Punkte zu beachten:

  • Beispiel 1 - Alle Zeichenfolgen verwenden doppelte Anführungszeichen.
  • Beispiel 2 - Keine Zeichenfolgen (außer den letzten beiden) verwenden Anführungszeichen.
  • Im YAML-Kochbuch heißt es: Wenn Sie Zeichenfolgen in doppelte Anführungszeichen setzen, können Sie Escapezeichen verwenden, um ASCII- und Unicode-Zeichen darzustellen. Bedeutet dies, dass ich nur doppelte Anführungszeichen verwenden muss, wenn ich einigen Zeichen entkommen möchte? Wenn ja - warum verwenden sie im ersten Beispiel überall doppelte Anführungszeichen - nur aus Gründen der Einheit / des Stils?
  • In den letzten beiden Zeilen von Beispiel 2 wird !das unspezifische Tag verwendet, in den letzten beiden Zeilen des ersten Beispiels nicht. Beide funktionieren.

Meine Frage ist: Welche Regeln gelten für die Verwendung der verschiedenen Arten von Anführungszeichen in YAML?

Könnte man sagen, dass:

  • Im Allgemeinen benötigen Sie keine Anführungszeichen.
  • Wenn Sie Zeichen maskieren möchten, verwenden Sie doppelte Anführungszeichen.
  • Verwendung !mit einfachen Anführungszeichen, wenn ...?!?

1
Der zweite Link funktioniert nicht mehr. Ich schlage vor, Ihre Beispiele in die Frage aufzunehmen.
Heroin

Antworten:


565

Nach einem kurzen Überblick über das in der Frage zitierte YAML-Kochbuch und einigen Tests ist hier meine Interpretation:

  • Im Allgemeinen benötigen Sie keine Anführungszeichen.
  • Verwenden Sie Anführungszeichen, um eine Zeichenfolge zu erzwingen, z. B. wenn Ihr Schlüssel oder Wert lautet 10, Sie jedoch möchten, dass eine Zeichenfolge und keine Fixnummer zurückgegeben wird, schreiben Sie '10'oder "10".
  • Verwenden Sie Anführungszeichen , wenn Ihr Wert Sonderzeichen enthält, (zB :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • Mit einfachen Anführungszeichen können Sie fast jedes Zeichen in Ihre Zeichenfolge einfügen und nicht versuchen, Escape-Codes zu analysieren. '\n'würde als Zeichenfolge zurückgegeben werden \n.
  • Doppelte Anführungszeichen analysieren Escape-Codes. "\n"würde als Zeilenvorschubzeichen zurückgegeben.
  • Das Ausrufezeichen führt eine Methode ein, z. B. !ruby/symum ein Ruby-Symbol zurückzugeben.

Mir scheint, der beste Ansatz wäre, keine Anführungszeichen zu verwenden, wenn Sie dies nicht müssen, und dann einfache Anführungszeichen zu verwenden, es sei denn, Sie möchten speziell Escape-Codes verarbeiten.

Aktualisieren

"Ja" und "Nein" sollten in Anführungszeichen (einfach oder doppelt) eingeschlossen werden, da sie sonst als TrueClass- und FalseClass-Werte interpretiert werden:

en:
  yesno:
    'yes': 'Yes'
    'no': 'No'

16
Das ist nicht ganz das ganze Bild. Zum Beispiel kann @und `überall in einer einfachen Zeichenfolge verwendet werden, außer am Anfang, da es sich um reservierte Indikatoren handelt .
Adam Spires

19
Ich habe nicht versucht, das vollständige Bild zu liefern, sondern nur einige Faustregeln. Ja, es sieht so aus, als könnten manchmal einige Sonderzeichen (reservierte Indikatoren) ohne Anführungszeichen verwendet werden (solange ein reservierter Indikator keinen einfachen Skalar startet), aber es ist nicht falsch, Anführungszeichen zu verwenden, wenn Sie ein Sonderzeichen sehen.
Mark Berry

33
Die Regeln für Strings in YAML sind wahnsinnig kompliziert, weil es so viele verschiedene Arten von Strings gibt. Ich habe hier eine Tabelle geschrieben: stackoverflow.com/questions/3790454/…
Steve Bennett

56
Angesichts all dieser Vorbehalte würde ich lieber überall Zitate verwenden: - /
Vicky Chijwani

6
Hier ist auch eine ziemlich vollständige Referenz, die ich geschrieben habe: blogs.perl.org/users/tinita/2018/03/…
tinita

0

Ich hatte dieses Problem, als ich mit Docker an einer Rails- Anwendung arbeitete .

Mein am meisten bevorzugter Ansatz ist es, im Allgemeinen keine Anführungszeichen zu verwenden. Dies beinhaltet, dass keine Anführungszeichen verwendet werden für:

  • Variablen wie ${RAILS_ENV}
  • Werte, die durch einen Doppelpunkt (:) getrennt sind, mögen postgres-log:/var/log/postgresql
  • andere Zeichenfolgenwerte

Ich verwende jedoch doppelte Anführungszeichen für integerWerte, die in Zeichenfolgen konvertiert werden müssen, wie:

  • Docker-Compose-Version wie version: "3.8"
  • Portnummern wie "8080:8080"

Jedoch für besondere Fälle wie booleans, floats, integersund andere Fälle, in denen für die Eingabewerte doppelte Anführungszeichen verwendet , könnten als interpretiert werden strings, bitte seien Sie nicht doppelte Anführungszeichen verwenden.

Hier ist eine Beispieldatei docker-compose.yml, um dieses Konzept zu erklären:

version: "3"

services:
  traefik:
    image: traefik:v2.2.1
    command:
      - --api.insecure=true # Don't do that in production
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

Das ist alles.

ich hoffe das hilft

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.