Як уникнути символів індикатора (тобто: або -) у YAML


241

У конфігураційному файлі у мене є ключ, якому я хочу призначити URL. Проблема полягає в тому, що YAML інтерпретує символи: і - як створення карт або списків, тому у нього є проблема з рядком

url: http://www.example-site.com/

(як через двокрапки, що слідує за http, так і дефісом посередині)

Чи є явний спосіб втечі ':' і '-'? Або вийшло б просто поставити всю річ в одиничні лапки і назвати це за день?


Відповіді:


232

Котирування:

"url: http://www.example-site.com/"

Щоб уточнити, я мав на увазі «цитувати значення» і спочатку вважав, що вся річ була цінністю. Якщо http://www.example-site.com/це значення, просто цитуйте його так:

url: "http://www.example-site.com/"

30
Це залежить від аналізатора, мабуть. Це не спрацювало з Jekyll YAML.
птомато

1
YAMLDotNet також надає котирування.
Dr1Ku

Нічого кращого? Тому що тоді цитати потрібно
уникати

2
Що ж, було б набагато крутіше мати документ, захищений від помилок, як і розмітка, так що хлопці, які не працюють в техніці, можуть редагувати його (напр., Локальні файли в Rails), не ризикуючи зламати його!
Августин Рідінгер

1
@ivan_pozdeev: Котирування обходять весь рядок. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ри-

182

Те, що також працює і що приємніше для довгих багаторядкових текстів, - це розміщення тексту з відступом у наступному рядку, після труби або знаку, що перевищує значення:

text: >
    Op dit plein stond het hoofdkantoor van de NIROM: Nederlands Indische 
    Radio Omroep

Труба зберігає нові рядки, знак gt перетворює всі наступні рядки в одну довгу рядок.


6
... і в кінці додається новий рядок, який зазвичай не є тим, що потрібно.
equaeghe

51
@equaeghe: Ви можете використовувати >-або |-для того, щоб запобігти цьому.
dououx

4
Це чудове рішення. Повністю уникає необхідності уникати інших символів у вашому тексті. +++ 90000 балів
bennlich

чи можна якось мати список мультиліній? Я спробував, - >але пункти після першого ігноруються.
ffghfgh

3
@ffghfgh - ур! Я не можу зрозуміти, як правильно форматувати код у коментарі, і тепер не можу редагувати оригінальний коментар. В основному, я використовував елемент списку з трубою, як це: - |а потім у новому рядку я відступив текст елемента списку так, щоб перший символ вишикувався разом із трубою. Я сподіваюся, що це допомагає, він працював для мене у файлі локалізації Rails 4.2.
Спакман

51

За даними YAML, ні те, ні це :не -повинно бути проблемою. :є лише роздільником ключів з пробілом після нього і -є лише індикатором масиву на початку рядка з пробілом після нього.

Але якщо з вашою реалізацією YAML є проблеми, можливо, у вас є багато варіантів:

- url: 'http://www.example-site.com/'
- url: "http://www.example-site.com/"
- url:
    http://www.example-site.com/
- url: >-
    http://www.example-site.com/
- url: |-
    http://www.example-site.com/

Однак явно не існує можливої ​​форми втечі в " простому стилі ".


1
Лінійка travisCI скаржиться на незвичайні колони
lint.travis-ci.org

Для Тревіса CI, здається, колонки всередині одиничних лапок є нормальними.
Malvineous

30

Котирування, але я віддаю перевагу їм за справедливим значенням:

url: "http://www.example.com/"

Якщо розмістити їх по всій лінії, схоже, це може спричинити проблеми.


21

Ще один спосіб, який працює з аналізатором YAML, який використовується в Jekyll:

title: My Life: A Memoir

Колони, за якими не проходять пробіли, схоже, не турбують YAML-аналізатор Джекілла, з іншого боку. Ні тире не робіть.


… Чи є особи символів частиною YAML? І що ж Джекілл використовує насправді YAML?
Ри-

Джекілл стверджує, що використовує це: jekyllrb.com/docs/frontmatter Я не можу знайти нічого про персонажних сутностей у специфікації YAML, тому я підозрюю, що Джекіл відхиляється, але я думаю, що ця відповідь добре допомагає людям Гуглінгу "ямлів втечу двокрапку", як мені ;-)
ptomato

4

Якщо ви використовуєте @ConfigurationPropertiesSpring Boot 2 для введення карт з ключами, що містять кольори, то вам потрібен додатковий рівень уникнення, використовуючи квадратні дужки всередині лапок, тому що весна дозволяє лише буквено-цифрові символи та "-", викреслюючи решту. Ваш новий ключ виглядатиме так:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Для ознайомлення дивіться цей випуск github.


Це є найбільш корисним у моєму випадку використання. Спасибі
anand

2

Я прийшов сюди, намагаючись змусити роботу завдання Azure DevOps Command Line. Що для мене працювало - це використання |символу pipe ( ). Використання >не вийшло.

Приклад:

steps:
- task: CmdLine@2
  inputs:
    script: |
      echo "Selecting Mono version..."
      /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_18_1"
      echo "Selecting Xcode version..."
      /bin/bash -c "echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'/Applications/Xcode_10.2.1.app;sudo xcode-select --switch /Applications/Xcode_10.2.1.app/Contents/Developer"

Я використовував те саме в .gitlab-ci.yml, але поки мені не потрібна труба '|' в сценарії - він мовчить на ньому :(
Далібор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.