Jak uniknąć znaków wskaźnikowych (tj .: lub -) w YAML


241

W pliku konfiguracyjnym mam klucz, do którego chcę przypisać adres URL. Problem polega na tym, że YAML interpretuje: i - znaki jako tworzenie mapowań lub list, więc ma problem z linią

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

(zarówno ze względu na dwukropek następujący po http, jak i łącznik na środku)

Czy istnieje wyraźny sposób na ucieczkę „:” i „-”? Czy może wystarczyłoby umieścić całość w pojedyncze cytaty i nazwać to dniem?


Odpowiedzi:


232

Cytaty:

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

Aby wyjaśnić, miałem na myśli „zacytować wartość” i początkowo myślałem, że cała rzecz jest wartością. Jeśli http://www.example-site.com/jest to wartość, wpisz ją w następujący sposób:

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

30
Najwyraźniej zależy to od parsera. To nie działa z Jekyll YAML.
ptomato

1
YAMLDotNet wyświetla również cytaty.
Dr1Ku,

Nic lepszego? Ponieważ wtedy cytaty należy wymykać same, co nie rozwiązuje problemu, ale po prostu przesuwa go do przodu ...
Augustin Riedinger

2
Cóż, byłoby znacznie fajniej mieć dokument odporny na błędy, podobnie jak markdown, więc ludzie bez wiedzy technicznej mogą go edytować (np. Pliki regionalne w Railsach) bez żadnego ryzyka jego uszkodzenia!
Augustin Riedinger

1
@ivan_pozdeev: Cudzysłowy otaczają cały ciąg. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

182

To, co również działa i jest jeszcze przyjemniejsze w przypadku długich, wielowierszowych tekstów, polega na umieszczeniu tekstu wciętego w następnym wierszu, po potoku lub znaku „więcej niż”:

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

Rura zachowuje nowe linie, znak GT zamienia wszystkie następujące linie w jeden długi ciąg.


6
... a na końcu dodawany jest nowy wiersz, który zwykle nie jest tym, czego chcesz.
equaeghe

51
@equaeghe: Możesz użyć >-lub |-, aby temu zapobiec.
dtoux

4
To wspaniałe rozwiązanie. Całkowicie unikasz ucieczki od innych znaków w tekście. +++ 90000 punktów
bennlich

czy można w jakiś sposób mieć listę multilinii? Próbowałem, - >ale przedmioty po pierwszym są ignorowane.
ffghfgh

3
@ffghfgh - urg! Nie mogę wymyślić, jak poprawnie sformatować kod w komentarzu, a teraz nie mogę edytować oryginalnego komentarza. Zasadniczo użyłem elementu listy z potokiem, takiego jak ten: - |a następnie w nowym wierszu wciąłem tekst elementu listy, tak aby pierwszy znak zrównał się z potokiem. Mam nadzieję, że to pomoże, zadziałało dla mnie w pliku ustawień regionalnych Rails 4.2.
Spakman

51

Zgodnie ze specyfikacją YAML, ani : ani nie -powinny stanowić problemu. :jest tylko separatorem klawiszy ze spacją po nim i -jest tylko wskaźnikiem tablicy na początku linii ze spacją po niej.

Ale jeśli Twoja implementacja YAML ma z tym problem, potencjalnie masz wiele opcji:

- 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/

Nie ma jednak wyraźnej formy ucieczki w „ prostym stylu ”.


1
Okładka travisCI narzeka na okrężnice u nietypowych - lint.travis-ci.org
koppor

W przypadku Travisa CI wydaje się, że dwukropki wewnątrz pojedynczych cudzysłowów są w porządku.
Malvineous,

30

Cytaty, ale wolę je na samej wartości:

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

Umieszczenie ich w poprzek całej linii wygląda na to, że może powodować problemy.


21

Innym sposobem, który działa z analizatorem składni YAML używanym w Jekyll:

title: My Life: A Memoir

Z drugiej strony dwukropki, po których nie występują spacje, nie przeszkadzają parserowi YAML Jekylla. Ani też myślniki.


… Czy jednostki znaków są częścią YAML? I czy Jekyll używa YAML?
Ry-

Jekyll twierdzi, że go używa: jekyllrb.com/docs/frontmatter Nie mogę znaleźć niczego na temat postaci postaci w specyfikacji YAML, więc podejrzewam, że Jekyll jest nieprawidłowy, ale myślę, że ta odpowiedź jest dobra dla ludzi, którzy googlują „yaml escape colon” ​​jak ja ;-)
ptomato

4

Jeśli używasz @ConfigurationPropertiesz Spring Boot 2 do wstrzykiwania map kluczami zawierającymi dwukropki, potrzebujesz dodatkowego poziomu ucieczki za pomocą nawiasów kwadratowych w cudzysłowie, ponieważ wiosna pozwala tylko na znaki alfanumeryczne i „-”, usuwając resztę. Twój nowy klucz wyglądałby tak:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Zobacz ten problem github w celach informacyjnych.


Jest to najbardziej pomocne w moim obecnym przypadku użycia. Dzięki
anand

2

Przybyłem tutaj, próbując uruchomić moje zadanie wiersza polecenia platformy Azure DevOps. Rzeczą, która działała dla mnie, było użycie |znaku pipe ( ). Korzystanie >nie działało.

Przykład:

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"

Użyłem tego samego w .gitlab-ci.yml , ale dopóki nie potrzebowałem fajki „|” w skrypcie - po cichu zawodzi :(
Dalibor,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.