YAML: Czy potrzebuję cudzysłowów dla ciągów w YAML?

Próbuję napisać słownik YAML dla internacjonalizacji projektu Rails. Jestem trochę zdezorientowany, ponieważ w niektórych plikach widzę ciągi w podwójnych cudzysłowach, a w niektórych bez. Kilka punktów do rozważenia:

  • przykład 1 - wszystkie łańcuchy znaków używają podwójnych cudzysłowów;
  • przykład 2 - żadne łańcuchy (poza dwoma ostatnimi) nie używają cudzysłowów;
  • YAML cookbook mówi: zamykanie łańcuchów w podwójnych cudzysłowach pozwala na użycie znaków specjalnych do reprezentowania znaków ASCII i Unicode. czy to oznacza, że muszę używać podwójnych cudzysłowów tylko wtedy, gdy chcę uciec od niektórych znaków? Jeśli tak-to dlaczego w pierwszym przykładzie wszędzie używają podwójnych cudzysłowów-tylko ze względu na jedność / powody stylistyczne?
  • dwie ostatnie linie przykładu 2 używają ! - niespecyficznego znacznika, podczas gdy dwie ostatnie linie pierwszego przykładu nie-i obie działają.

Moje pytanie brzmi: Jakie są zasady korzystania z różnych typów cytatów w YAML?

Można powiedzieć, że:

  • ogólnie rzecz biorąc, nie potrzebujesz cudzysłowów;
  • jeśli chcesz uniknąć znaków użyj podwójnych cudzysłowów;
  • użyj ! z pojedynczymi cudzysłowami, gdy... ?!?
Author: Promise Preston, 2013-10-01

2 answers

Po krótkim przeglądzie cytowanej w pytaniu książki kucharskiej YAML i kilku testach, oto moja interpretacja:]}

  • ogólnie rzecz biorąc, nie potrzebujesz cudzysłowów.
  • użyj cudzysłowów, aby wymusić łańcuch, np. jeśli twoim kluczem lub wartością jest 10, ale chcesz, aby zwrócił łańcuch, a nie Fixnum, napisz '10' lub "10".
  • użyj cudzysłowów, jeśli wartość zawiera znaki specjalne, (np. :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • pojedyncze cudzysłowy pozwalają umieścić prawie każdy znak w łańcuchu i nie będą próbowały analizować kodów ucieczki. '\n' zostanie zwrócony jako łańcuch \n.
  • double quotes parse Escape codes. "\n" zostanie zwrócony jako znak kanału linii.
  • wykrzyknik wprowadza metodę, np. !ruby/sym zwracającą symbol Ruby.

Wydaje mi się, że najlepszym podejściem byłoby nie używać cudzysłowów, chyba że trzeba, a następnie używać pojedynczych cudzysłowów, chyba że chcesz przetwarzać kody specjalne.

Update

W przeciwnym razie zostaną one zinterpretowane jako wartości TrueClass i FalseClass:

"Yes" I "No" powinny być zawarte w cudzysłowach (pojedyncze lub podwójne).]}

en:
  yesno:
    'yes': 'Yes'
    'no': 'No'
 652
Author: Mark Berry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-10 17:56:18

Miałem ten problem podczas pracy nad rails aplikacją z Docker.

Moim najbardziej preferowanym podejściem jest ogólnie , a nie używanie cudzysłowów. Obejmuje to Nie używanie cudzysłowów dla:

  • zmienne jak ${RAILS_ENV}
  • wartości oddzielone dwukropkiem (:) jak postgres-log:/var/log/postgresql
  • inne wartości ciągów

Używam jednak cudzysłowów dla integer wartości, które muszą być przekonwertowane na ciągi znaków like:

  • docker-skomponuj wersję jak version: "3.8"
  • liczby portów jak "8080:8080"

Jednak w szczególnych przypadkach, takich jak booleans, floats, integers, i inne przypadki, w których używanie podwójnych cudzysłowów dla wartości wejściowych może być interpretowane jako strings, proszę zrobić , a nie używać podwójnych cudzysłowów.

Oto przykładowy plik docker-compose.yml, aby wyjaśnić tę koncepcję:

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
To wszystko.

Mam nadzieję, że to pomoże

 1
Author: Promise Preston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-17 08:30:17