YAML: Tôi có cần trích dẫn cho chuỗi trong YAML không?


398

Tôi đang cố gắng viết một từ điển YAML để quốc tế hóa một dự án Rails. Mặc dù vậy, tôi hơi bối rối, vì trong một số tệp tôi thấy các chuỗi trong dấu ngoặc kép và trong một số không có. Một vài điểm cần xem xét:

  • ví dụ 1 - tất cả các chuỗi sử dụng dấu ngoặc kép;
  • ví dụ 2 - không có chuỗi (trừ hai chuỗi cuối) sử dụng dấu ngoặc kép;
  • các sách dạy nấu ăn YAML nói: Kèm theo chuỗi trong dấu ngoặc kép cho phép bạn sử dụng để đại diện cho escapings ASCII và Unicode ký tự. Điều này có nghĩa là tôi chỉ cần sử dụng dấu ngoặc kép khi tôi muốn thoát một số ký tự? Nếu có - tại sao họ sử dụng dấu ngoặc kép ở mọi nơi trong ví dụ đầu tiên - chỉ vì lý do thống nhất / phong cách?
  • hai dòng cuối cùng của ví dụ 2 sử dụng !- thẻ không cụ thể, trong khi hai dòng cuối cùng của ví dụ đầu tiên không - và cả hai đều hoạt động.

Câu hỏi của tôi là: các quy tắc sử dụng các loại trích dẫn khác nhau trong YAML là gì?

Có thể nói rằng:

  • nói chung, bạn không cần báo giá;
  • nếu bạn muốn thoát ký tự, hãy sử dụng dấu ngoặc kép;
  • sử dụng !với dấu ngoặc đơn, khi ...?!?

1
Liên kết thứ hai không hoạt động nữa, tôi đề nghị đưa các ví dụ của bạn vào câu hỏi.
heroin

Câu trả lời:


565

Sau khi xem xét ngắn gọn về sách dạy nấu ăn YAML được trích dẫn trong câu hỏi và một số thử nghiệm, đây là cách giải thích của tôi:

  • Nói chung, bạn không cần báo giá.
  • Sử dụng dấu ngoặc kép để buộc một chuỗi, ví dụ nếu khóa hoặc giá trị của bạn là 10nhưng bạn muốn nó trả về Chuỗi và không phải là Fixnum, ghi '10'hoặc "10".
  • Sử dụng dấu ngoặc kép nếu giá trị của bạn bao gồm ký tự đặc biệt, (ví dụ như :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \).
  • Dấu ngoặc đơn cho phép bạn đặt gần như bất kỳ ký tự nào trong chuỗi của mình và sẽ không cố phân tích mã thoát. '\n'sẽ được trả lại dưới dạng chuỗi \n.
  • Dấu ngoặc kép mã thoát. "\n"sẽ được trả lại dưới dạng một ký tự nguồn cấp.
  • Dấu chấm than giới thiệu một phương thức, ví dụ !ruby/symđể trả về biểu tượng Ruby.

Dường như với tôi rằng cách tiếp cận tốt nhất sẽ là không sử dụng dấu ngoặc kép trừ khi bạn phải, và sau đó sử dụng dấu ngoặc đơn trừ khi bạn đặc biệt muốn xử lý mã thoát.

Cập nhật

"Có" và "Không" nên được đặt trong dấu ngoặc kép (một hoặc hai) nếu không chúng sẽ được hiểu là các giá trị TrueClass và falseClass:

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

16
Đó không phải là hình ảnh đầy đủ. Ví dụ, @và `có thể được sử dụng ở bất cứ đâu trong một chuỗi đơn giản trừ lúc bắt đầu, bởi vì chúng là các chỉ số dành riêng .
Adam Spiers

19
Tôi đã không cố gắng cung cấp hình ảnh đầy đủ, chỉ là một số quy tắc. Có, có vẻ như đôi khi, một số ký tự đặc biệt (chỉ báo dành riêng) có thể được sử dụng mà không có dấu ngoặc kép (miễn là chỉ báo dành riêng không bắt đầu vô hướng đơn giản), nhưng không sai khi sử dụng dấu ngoặc kép bất cứ khi nào bạn nhìn thấy một ký tự đặc biệt.
Mark Berry

33
Các quy tắc cho chuỗi trong YAML rất phức tạp, bởi vì có rất nhiều loại chuỗi khác nhau. Tôi đã viết lên một bảng ở đây: stackoverflow.com/questions/3790454/ trộm
Steve Bennett

56
Với tất cả những cảnh báo này, tôi chỉ muốn sử dụng dấu ngoặc kép ở mọi nơi: - /
Vicky Chijwani

6
Ngoài ra, đây là một tài liệu tham khảo khá đầy đủ mà tôi đã viết: blog.perl.org/users/tinita/2018/03/ mẹo
tinita

0

Tôi đã có mối quan tâm này khi làm việc trên ứng dụng Rails với Docker .

Cách tiếp cận ưa thích nhất của tôi là thường không sử dụng dấu ngoặc kép. Điều này bao gồm không sử dụng dấu ngoặc kép cho:

  • các biến như ${RAILS_ENV}
  • các giá trị được phân tách bằng dấu hai chấm (:) như postgres-log:/var/log/postgresql
  • các giá trị chuỗi khác

Tuy nhiên, tôi sử dụng dấu ngoặc kép cho integercác giá trị cần được chuyển đổi thành các chuỗi như:

  • phiên bản docker-compose như version: "3.8"
  • số cổng như "8080:8080"

Tuy nhiên, đối với trường hợp đặc biệt thích booleans, floats, integers, và các trường hợp khác, nơi sử dụng dấu nháy kép cho các giá trị nhập có thể được hiểu là strings, xin đừng không sử dụng dấu nháy kép.

Đây là một docker-compose.ymltệp mẫu để giải thích khái niệm này:

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

Đó là tất cả.

Tôi hi vọng cái này giúp được

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.