YAML: Preciso de aspas para seqüências de caracteres no YAML?

398

Estou tentando escrever um dicionário YAML para internacionalização de um projeto Rails. Estou um pouco confuso, como em alguns arquivos, vejo seqüências de caracteres entre aspas duplas e outras sem. Alguns pontos a considerar:

  • exemplo 1 - todas as strings usam aspas duplas;
  • exemplo 2 - nenhuma string (exceto as duas últimas) usa aspas;
  • o livro de receitas do YAML diz: Colocar seqüências de caracteres entre aspas duplas permite usar escapes para representar caracteres ASCII e Unicode. Isso significa que eu preciso usar aspas duplas apenas quando quiser escapar de alguns caracteres? Se sim - por que eles usam aspas duplas em todos os lugares no primeiro exemplo - apenas por razões de unidade / estilo?
  • as duas últimas linhas do exemplo 2 usam !- a tag não específica, enquanto as duas últimas linhas do primeiro exemplo não - e as duas funcionam.

Minha pergunta é: quais são as regras para o uso dos diferentes tipos de cotação no YAML?

Pode-se dizer que:

  • em geral, você não precisa de aspas;
  • se você quiser escapar de caracteres, use aspas duplas;
  • use !com aspas simples, quando ...?!?
Alexander
fonte
11
O segundo link não está mais funcionando, sugiro colocar seus exemplos em questão.
heroína

Respostas:

565

Após uma breve revisão do livro de receitas da YAML citada na pergunta e em alguns testes, aqui está minha interpretação:

  • Em geral, você não precisa de aspas.
  • Use aspas para forçar uma string, por exemplo, se sua chave ou valor for 10mas você deseja que ela retorne uma String e não um Fixnum, escreva '10'ou "10".
  • Use aspas se o valor inclui caracteres especiais, (por exemplo :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • Aspas simples permitem que você coloque quase qualquer caractere em sua string e não tentam analisar os códigos de escape. '\n'seria retornado como a string \n.
  • Aspas duplas analisam códigos de escape. "\n"seria retornado como um caractere de avanço de linha.
  • O ponto de exclamação introduz um método, por exemplo, !ruby/sympara retornar um símbolo Ruby.

Parece-me que a melhor abordagem seria não usar aspas, a menos que você precise, e depois usar aspas simples, a menos que você queira especificamente processar códigos de escape.

Atualizar

"Sim" e "Não" devem ser colocados entre aspas (simples ou duplas) ou serão interpretados como valores TrueClass e FalseClass:

en:
  yesno:
    'yes': 'Yes'
    'no': 'No'
Mark Berry
fonte
16
Essa não é a imagem completa. Por exemplo, @e `pode ser usado em qualquer lugar em uma sequência simples, exceto no início, porque são indicadores reservados .
Adam Spiers
19
Eu não estava tentando fornecer a imagem completa, apenas algumas regras práticas. Sim, parece que, às vezes, alguns caracteres especiais (indicadores reservados) podem ser usados ​​sem aspas (desde que um indicador reservado não inicie um escalar simples), mas não é errado usar aspas sempre que você vir um caractere especial.
Mark Berry
33
As regras para cadeias de caracteres no YAML são incrivelmente complicadas, porque existem muitos tipos diferentes de cadeias. Eu escrevi uma tabela aqui: stackoverflow.com/questions/3790454/…
Steve Bennett
56
Dadas todas essas advertências, prefiro usar aspas em todos os lugares: - /
Vicky Chijwani 17/02
6
Além disso, aqui está uma referência bastante completa que escrevi: blogs.perl.org/users/tinita/2018/03/…
tinita
0

Eu tive essa preocupação ao trabalhar em um aplicativo Rails com o Docker .

Minha abordagem mais preferida é geralmente não usar aspas. Isso inclui não usar aspas para:

  • variáveis ​​como ${RAILS_ENV}
  • valores separados por dois pontos (:) como postgres-log:/var/log/postgresql
  • outros valores de strings

No entanto, uso aspas duplas para integervalores que precisam ser convertidos em strings como:

  • versão docker-compor como version: "3.8"
  • números de porta como "8080:8080"

No entanto, para casos especiais como booleans, floats, integers, e outros casos, sempre usando aspas para os valores de entrada poderia ser interpretado como strings, por favor, não use aspas.

Aqui está um docker-compose.ymlarquivo de amostra para explicar esse conceito:

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

Isso é tudo.

Eu espero que isso ajude

Promise Preston
fonte