YAML: Ai-je besoin de guillemets pour les chaînes en YAML?

398

J'essaie d'écrire un dictionnaire YAML pour l'internationalisation d'un projet Rails. Je suis un peu confus cependant, car dans certains fichiers, je vois des chaînes entre guillemets et dans certains sans. Quelques points à considérer:

  • exemple 1 - toutes les chaînes utilisent des guillemets doubles;
  • exemple 2 - aucune chaîne (sauf les deux dernières) utilise des guillemets;
  • le livre de recettes YAML dit: Mettre des chaînes entre guillemets vous permet d'utiliser des échappements pour représenter les caractères ASCII et Unicode. Est-ce à dire que je dois utiliser des guillemets doubles uniquement lorsque je veux échapper à certains caractères? Si oui - pourquoi utilisent-ils des guillemets partout dans le premier exemple - uniquement pour des raisons d'unité / de style?
  • les deux dernières lignes de l'exemple 2 utilisent !- la balise non spécifique, contrairement aux deux dernières lignes du premier exemple - et elles fonctionnent toutes les deux.

Ma question est: quelles sont les règles d'utilisation des différents types de devis en YAML?

Pourrait-on dire que:

  • en général, vous n'avez pas besoin de devis;
  • si vous voulez échapper des caractères, utilisez des guillemets doubles;
  • utiliser !avec des guillemets simples, quand ...?!?
Alexandre
la source
1
Le deuxième lien ne fonctionne plus, je suggère de mettre vos exemples dans la question.
héroïne

Réponses:

565

Après une brève revue du livre de cuisine YAML cité dans la question et quelques tests, voici mon interprétation:

  • En général, vous n'avez pas besoin de devis.
  • Utilisez des guillemets pour forcer une chaîne, par exemple si votre clé ou valeur est 10mais que vous voulez qu'elle renvoie une chaîne et non un Fixnum, écrivez '10'ou "10".
  • Utilisez des guillemets si votre valeur, des caractères spéciaux (par exemple :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • Les guillemets simples vous permettent de mettre presque n'importe quel caractère dans votre chaîne et n'essaient pas d'analyser les codes d'échappement. '\n'serait retourné comme chaîne \n.
  • Les guillemets doubles analysent les codes d'échappement. "\n"serait retourné comme un caractère de saut de ligne.
  • Le point d'exclamation introduit une méthode, par exemple !ruby/sympour renvoyer un symbole Ruby.

Il me semble que la meilleure approche serait de ne pas utiliser de guillemets sauf si vous le devez, puis d'utiliser des guillemets simples sauf si vous souhaitez spécifiquement traiter les codes d'échappement.

Mise à jour

"Oui" et "Non" doivent être placés entre guillemets (simples ou doubles), sinon ils seront interprétés comme des valeurs TrueClass et FalseClass:

en:
  yesno:
    'yes': 'Yes'
    'no': 'No'
Mark Berry
la source
16
Ce n'est pas tout à fait l'image complète. Par exemple, @et `peut être utilisé n'importe où dans une chaîne ordinaire, sauf au début, car ce sont des indicateurs réservés .
Adam Spires
19
Je n'essayais pas de fournir l'image complète, juste quelques règles de base. Oui, il semble parfois que certains caractères spéciaux (indicateurs réservés) peuvent être utilisés sans guillemets (tant qu'un indicateur réservé ne démarre pas un scalaire simple), mais il n'est pas faux d'utiliser des guillemets chaque fois que vous voyez un caractère spécial.
Mark Berry
33
Les règles pour les chaînes en YAML sont incroyablement compliquées, car il existe de nombreux types de chaînes différents. J'ai écrit un tableau ici: stackoverflow.com/questions/3790454/…
Steve Bennett
56
Compte tenu de toutes ces mises en garde, je préfère simplement utiliser des guillemets partout: - /
Vicky Chijwani
6
En outre, voici une référence assez complète que j'ai écrite: blogs.perl.org/users/tinita/2018/03/…
tinita
0

J'avais cette préoccupation lorsque je travaillais sur une application Rails avec Docker .

Mon approche préférée est généralement de ne pas utiliser de guillemets. Cela inclut de ne pas utiliser de guillemets pour:

  • des variables comme ${RAILS_ENV}
  • valeurs séparées par deux points (:) comme postgres-log:/var/log/postgresql
  • autres valeurs de chaînes

Cependant, j'utilise des guillemets doubles pour les integervaleurs qui doivent être converties en chaînes comme:

  • version docker-compose comme version: "3.8"
  • numéros de port comme "8080:8080"

Cependant, pour des cas particuliers comme booleans, floats, integerset d' autres cas où l' aide des guillemets doubles pour les valeurs d'entrée peuvent être interprétées comme strings, s'il vous plaît ne pas utiliser des guillemets doubles.

Voici un exemple de docker-compose.ymlfichier pour expliquer ce concept:

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

C'est tout.

J'espère que ça aide

Promise Preston
la source