Как сложить многострочную строку yaml с отступами - PullRequest
0 голосов
/ 19 февраля 2019

(прежде чем дать ответ, учтите, что я пробовал и >, и >-, но безуспешно).

Я пытаюсь представить ансиальные переменные.Я хочу, чтобы хорошо отформатированный SQL-запрос (псевдо-sql) складывался в строку без символов новой строки.

Моя проблема в том, что оператор > не работает, если в строке есть идентификаторы ...

---
- hosts: localhost
  gather_facts: no
  tasks:
   - debug: var=foo
  vars:
   foo: >
     select foo
       from bar
       where ok
     join left
       select baz
       from boo

Производит:

ok: [localhost] => { "foo": "select foo\n from bar\n where ok\njoin left\n select baz\n from boo\n \n" }

И я не хочу видеть \n в середине текста.Может ли это быть решено только силами YAML?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Причиной появления новых строк в данных, загружаемых из YAML, является то, что в соответствии со спецификацией YAML :

Сворачивание позволяет разбивать длинные строки везде, где отделяется один пробелдва непробельных символа.

И, поскольку перед from bar есть пробелы, новая строка на предыдущей строке не может быть в «сгибе» и является жесткой новой строкой.

Чтобы «решить» это только с помощью YAML, вы можете попробовать использовать скаляры простого стиля , как уже указывалось @flyx, но имейте в виду, что есть несколько ограничений на простые скаляры, которые не применяются к сложенным скалярам.Они могут не относиться к вашему примеру, но, вероятно, применимы, когда у вас есть настоящий синтаксис SQL.

Еще одна вещь, которую вы могли бы сделать, это не делать отступ после сгибов:

foo: >
  select foo
  from bar
  where ok
  join left
  select baz
  from boo

, который на самом деле не делает вещи более читабельными, но не имеет ограничений, которые имеют простые скаляры стиля.

Наилучшим решением при сохранении максимальной читаемости будет добавление тега и использование скалярного литерального стиля

foo: !flatten |
  select foo
    from bar
    where ok
  join left
    select baz
    from boo

и загрузка объекта для тега !flatten, развернитесоответствующие строки во время загрузки (т. е. заменить новую строку, за которой следуют пробелы, одной новой строкой).

Хотя использование тегов является ИМО лучшим решением, оно расширяет термин «только YAML» за пределы разумного.

0 голосов
/ 19 февраля 2019

Да, это самая странная «особенность» YAML.Вместо этого используйте простые многострочные скаляры:

---
- hosts: localhost
  gather_facts: no
  tasks:
   - debug: var=foo
  vars:
   foo:
     select foo
       from bar
       where ok
     join left
       select baz
       from boo
...