YAML: ฉันต้องการคำพูดสำหรับสตริงใน YAML หรือไม่


398

ฉันกำลังพยายามเขียนพจนานุกรม YAML สำหรับโครงการ Rails ที่เป็นสากล ฉันสับสนเล็กน้อยเช่นเดียวกับในไฟล์บางไฟล์ฉันเห็นสตริงในเครื่องหมายคำพูดคู่และบางไฟล์ไม่มี ประเด็นที่ควรพิจารณา:

  • ตัวอย่างที่ 1 - สตริงทั้งหมดใช้เครื่องหมายคำพูดคู่
  • ตัวอย่างที่ 2 - ไม่มีสตริง (ยกเว้นสองอันสุดท้าย) ใช้เครื่องหมายคำพูด
  • ตำรา YAMLกล่าวว่าการปิดล้อมสตริงในราคาคู่ช่วยให้คุณใช้ escapings เพื่อเป็นตัวแทนของ ASCII และ Unicode ตัวอักษร หมายความว่าฉันต้องใช้เครื่องหมายคำพูดคู่เมื่อฉันต้องการหลีกเลี่ยงอักขระบางตัวเท่านั้นหรือไม่ ถ้าใช่ - ทำไมพวกเขาใช้เครื่องหมายคำพูดคู่ทุกที่ในตัวอย่างแรก - เพื่อเหตุผลของความสามัคคี / โวหารเท่านั้น?
  • ตัวอย่างสองบรรทัดสุดท้าย 2 ใช้!- แท็กที่ไม่เฉพาะเจาะจงในขณะที่ทั้งสองบรรทัดสุดท้ายของตัวอย่างแรกไม่ได้ - และทั้งสองทำงาน

คำถามของฉันคืออะไรกฎสำหรับการใช้คำพูดประเภทต่าง ๆ ใน YAML คืออะไร?

อาจกล่าวได้ว่า:

  • โดยทั่วไปคุณไม่ต้องการคำพูด
  • หากคุณต้องการหลีกเลี่ยงอักขระให้ใช้เครื่องหมายคำพูดคู่
  • ใช้!กับคำพูดเดียวเมื่อ ... ?!?

1
ลิงก์ที่สองไม่ทำงานอีกต่อไปฉันขอแนะนำให้ใส่ตัวอย่างของคุณลงในคำถาม
เฮโรอีน

คำตอบ:


565

หลังจากการทบทวนสั้น ๆ ของตำราอาหาร YAML ที่อ้างถึงในคำถามและการทดสอบบางส่วนนี่คือการตีความของฉัน:

  • โดยทั่วไปคุณไม่จำเป็นต้องมีเครื่องหมายคำพูด
  • ใช้คำพูดที่จะบังคับสตริงเช่นถ้าคีย์หรือค่าของคุณ10แต่คุณอยากให้มันกลับมาเป็นสตริงและไม่ Fixnum, เขียนหรือ'10'"10"
  • ใช้คำพูดถ้าค่าของคุณมีอักขระพิเศษ (เช่น:, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \)
  • อัญประกาศเดี่ยวให้คุณใส่อักขระเกือบทุกตัวในสตริงของคุณและจะไม่พยายามแยกวิเคราะห์รหัสหลบหนี จะกลับมาเป็นสตริง'\n'\n
  • เครื่องหมายคำพูดคู่รหัสการหลีกเลี่ยง "\n"จะถูกส่งคืนเป็นอักขระป้อนบรรทัด
  • เครื่องหมายอัศเจรีย์แนะนำวิธีการเช่น!ruby/symส่งคืนสัญลักษณ์ทับทิม

ดูเหมือนกับฉันว่าวิธีที่ดีที่สุดคือไม่ใช้อัญประกาศนอกจากคุณจะต้องใช้เครื่องหมายอัญประกาศแล้วให้ใช้เครื่องหมายอัญประกาศเดี่ยวเว้นเสียแต่ว่าคุณต้องการประมวลผลรหัสหลบหนีเป็นพิเศษ

ปรับปรุง

"ใช่" และ "ไม่" ควรอยู่ในเครื่องหมายคำพูด (เดี่ยวหรือสองครั้ง) มิฉะนั้นจะถูกตีความว่าเป็นค่า TrueClass และ FalseClass:

en:
  yesno:
    'yes': 'Yes'
    'no': 'No'

16
นั่นไม่ใช่ภาพรวม ยกตัวอย่างเช่น@และ `สามารถใช้ที่ใดก็ได้ในสตริงธรรมดายกเว้นที่จุดเริ่มต้นเพราะพวกเขาจะสงวนไว้หุ้น
Adam Spires

19
ฉันไม่ได้พยายามที่จะให้ภาพเต็มเพียงกฎของหัวแม่มือ ใช่บางครั้งดูเหมือนว่าอักขระพิเศษบางตัว (ตัวบ่งชี้ที่สงวนไว้) สามารถใช้งานได้โดยไม่ต้องใส่เครื่องหมายอัญประกาศ (ตราบใดที่ตัวบ่งชี้ที่สงวนไว้ไม่ได้เริ่มเกลาธรรมดา) แต่ก็ไม่ผิดที่จะใช้เครื่องหมายอัญประกาศเมื่อใดก็ตามที่คุณเห็นอักขระพิเศษ
Mark Berry

33
กฎสำหรับสตริงใน YAML มีความซับซ้อนอย่างบ้าคลั่งเนื่องจากมีสตริงประเภทต่างๆมากมาย ฉันเขียนตารางไว้ที่นี่: stackoverflow.com/questions/3790454/…
Steve Bennett

56
ให้คำเตือนเหล่านี้ทั้งหมดฉันควรใช้เครื่องหมายคำพูดทุกที่: - /
Vicky Chijwani

6
นอกจากนี้นี่เป็นข้อมูลอ้างอิงที่ค่อนข้างสมบูรณ์ที่ฉันเขียนไว้: blogs.perl.org/users/tinita/2018/03/…
tinita

0

ผมมีความกังวลนี้เมื่อทำงานบนรถไฟแอพลิเคชันที่มีหาง

วิธีที่ฉันชอบมากที่สุดคือการไม่ใช้คำพูด ซึ่งรวมถึงการไม่ใช้เครื่องหมายคำพูดสำหรับ:

  • ตัวแปรที่ชอบ ${RAILS_ENV}
  • ค่าคั่นด้วยเครื่องหมายโคลอน (:) เช่น postgres-log:/var/log/postgresql
  • ค่าสตริงอื่น ๆ

อย่างไรก็ตามฉันใช้เครื่องหมายคำพูดคู่สำหรับintegerค่าที่จำเป็นต้องแปลงเป็นสตริงเช่น:

  • รุ่นนักเขียนที่ชอบ version: "3.8"
  • หมายเลขพอร์ตเช่น "8080:8080"

อย่างไรก็ตามสำหรับกรณีพิเศษชอบbooleans, floats, integersและกรณีอื่น ๆ ที่ใช้คำพูดคู่สำหรับค่ารายการที่อาจจะตีความได้ว่าstringsโปรดอย่าได้ใช้ราคาสองครั้ง

นี่คือตัวอย่างdocker-compose.ymlไฟล์ที่จะอธิบายแนวคิดนี้:

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

นั่นคือทั้งหมดที่

ฉันหวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.