วิธียกเว้นอักขระตัวบ่งชี้ (เช่น: หรือ -) ใน YAML


241

ในไฟล์กำหนดค่าฉันมีรหัสที่ฉันต้องการกำหนด URL ปัญหาคือการตีความ YAML: และ - ตัวละครเป็นการสร้างการแมปหรือรายการดังนั้นจึงมีปัญหากับสาย

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

(ทั้งคู่เนื่องจากโคลอนติดตาม http และเครื่องหมายขีดกลาง)

มีวิธีที่ชัดเจนในการหลบหนี ':' และ '-' หรือไม่? หรือมันจะทำงานเพื่อเพียงแค่ใส่ทุกอย่างในคำพูดเดียวและเรียกมันว่าวัน?


ดูเพิ่มเติมที่: en.wikipedia.org/wiki/Delimiter#Delimiter_collision
dreftymac

คำตอบ:


232

คำคม:

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

เพื่ออธิบายให้ชัดเจนฉันหมายถึง“ พูดถึงคุณค่า” แต่เดิมคิดว่าสิ่งทั้งหมดคือคุณค่า ถ้าhttp://www.example-site.com/เป็นมูลค่าเพียงแค่พูดอย่างนั้น:

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

30
มันขึ้นอยู่กับเครื่องมือแยกวิเคราะห์ สิ่งนี้ใช้ไม่ได้กับ Jekyll YAML
ptomato

1
YAMLDotNet ยังแสดงราคา
Dr1Ku

ไม่มีอะไรดีกว่า เพราะคำพูดนั้นจะต้องหลบหนีตัวเองซึ่งไม่ได้แก้ปัญหา แต่ก็ย้ายไปข้างหน้า ...
Augustin Riedinger

2
มันคงจะเจ๋งกว่าถ้ามีเอกสารพิสูจน์ข้อผิดพลาดเหมือนกับ markdown ดังนั้นทีมที่ไม่ใช้เทคโนโลยีสามารถแก้ไขได้ (เช่นไฟล์ locale ใน Rails) โดยไม่มีความเสี่ยงในการทำลาย!
Augustin Riedinger

1
@ivan_pozdeev: เครื่องหมายคำพูดจะล้อมรอบสตริงทั้งหมด - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

182

สิ่งที่ใช้งานได้และยังดีกว่าสำหรับข้อความยาวหลายบรรทัดกำลังวางข้อความของคุณที่เยื้องในบรรทัดถัดไปหลังจากที่ไปป์หรือเครื่องหมายมากกว่า:

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

ไปป์รักษาบรรทัดใหม่ gt-sign เปลี่ยนบรรทัดต่อไปนี้ทั้งหมดเป็นสตริงยาวหนึ่งบรรทัด


6
... และมีการเพิ่มบรรทัดใหม่ในตอนท้ายซึ่งมักจะไม่ใช่สิ่งที่คุณต้องการ
equaeghe

51
@equaeghe: คุณสามารถใช้>-หรือ|-เพื่อป้องกันสิ่งนี้
dtoux

4
นี่เป็นทางออกที่ยอดเยี่ยม หลีกเลี่ยงตัวละครอื่น ๆ ในข้อความของคุณโดยสิ้นเชิง +++ 90000 คะแนน
bennlich

เป็นไปได้ไหมที่จะมีรายการหลายรายการ? ฉันได้ลองแล้ว- >แต่รายการหลังจากแรกถูกข้ามไป
ffghfgh

3
@ffghfgh - เร่งด่วน! ฉันไม่สามารถหาวิธีจัดรูปแบบรหัสได้อย่างถูกต้องในความคิดเห็นและตอนนี้ฉันไม่สามารถแก้ไขความคิดเห็นดั้งเดิมได้ โดยพื้นฐานแล้วฉันใช้ไอเท็มรายการกับไพพ์เช่นนี้- |แล้วบนบรรทัดใหม่ฉันเยื้องข้อความไอเท็มในรายการ ฉันหวังว่าจะช่วยได้มันใช้ได้กับฉันในไฟล์ภาษา 4.2 ของ Rails
Spakman

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
linter ของ travisCI บ่นเกี่ยวกับ colons ผิดปกติ - lint.travis-ci.org
koppor

สำหรับ Travis CI ดูเหมือนว่าโคลอนในเครื่องหมายคำพูดเดี่ยว ๆ นั้นก็โอเค
Malvineous

30

คำพูด แต่ฉันชอบพวกเขาในค่าเพียง:

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

การวางข้ามบรรทัดทั้งหมดดูเหมือนว่าอาจทำให้เกิดปัญหา


21

อีกวิธีที่ทำงานร่วมกับตัวแยกวิเคราะห์ YAML ที่ใช้ใน Jekyll:

title: My Life: A Memoir

Colons ที่ไม่ตามด้วยช่องว่างดูเหมือนจะไม่รบกวนตัวแยกวิเคราะห์ YAML ของ Jekyll ในทางกลับกัน ไม่ขีดคั่น


…หน่วยงานตัวละครเป็นส่วนหนึ่งของ YAML หรือไม่ และสิ่งที่ Jekyll ใช้จริงคือ YAML
Ry-

Jekyll อ้างว่าใช้มัน: jekyllrb.com/docs/frontmatterฉันไม่สามารถหาอะไรเกี่ยวกับตัวละครในข้อมูลจำเพาะของ YAML ดังนั้นฉันสงสัยว่า Jekyll นั้นผิดปกติ แต่ฉันคิดว่าคำตอบนี้เหมาะสำหรับผู้ที่ใช้ Googling "yaml escape colon" เช่น me ;-)
ptomato

4

หากคุณใช้@ConfigurationPropertiesกับ Spring Boot 2 เพื่อฉีดแผนที่ด้วยปุ่มที่มีเครื่องหมายโคลอนแล้วคุณจำเป็นต้องเพิ่มระดับการหลบหนีโดยใช้วงเล็บเหลี่ยมด้านในเครื่องหมายคำพูดเนื่องจากสปริงอนุญาตเฉพาะอักขระที่เป็นตัวอักษรและตัวเลขและ - - เพื่อแยกส่วนที่เหลือออก รหัสใหม่ของคุณจะเป็นดังนี้:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

ดูนี้ปัญหา GitHub สำหรับการอ้างอิง


สิ่งนี้มีประโยชน์มากที่สุดในกรณีการใช้งานปัจจุบันของฉัน ขอบคุณ
อานันท์

2

ฉันมาที่นี่เพื่อพยายามทำให้ Azure DevOps Command Line ทำงานได้ สิ่งที่ได้ผลสำหรับฉันก็คือการใช้|ตัวละครไปป์ ( ) การใช้>ไม่ทำงาน

ตัวอย่าง:

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แต่ฉันต้องการท่อ '|' ในสคริปต์ - มันล้มเหลวอย่างเงียบ ๆ บนมัน :(
Dalibor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.