Ý nghĩa của &, <<, * trong tệp database.yml này là gì?


161

Cho đến bây giờ tôi chỉ sử dụng cơ sở dữ liệu.yml với mỗi tham số được gọi rõ ràng, trong tệp bên dưới, nó sử dụng một số ký tự mà tôi không hiểu. Mỗi dòng và ký hiệu (&, *, <<) nghĩa là gì, làm thế nào để tôi đọc tệp này?

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  <<: *default
  database: test_test


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production

6
Trong tệp yml, bạn không phải viết lại các tham số kết nối cơ sở dữ liệu trong môi trường khác nhau nếu các thông số kết nối tương tự nhau. Ở đây trong trường hợp đã đề cập ở trên, dưa chuột môi trường sử dụng các thông số kết nối chính xác như trong môi trường thử nghiệm. Và môi trường sản xuất sử dụng các tham số kết nối như trong phát triển ngoại trừ tên cơ sở dữ liệu. Đây là một cái gì đó giống như mã DRY (Đừng lặp lại chính mình). Xin vui lòng để sửa cho tôi.
kxhitiz

Câu trả lời:


191

Các &đánh dấu một bí danh cho nút (trong ví dụ của bạn đặt &defaultbí danh cho nút phát triển là "mặc định") và *tham chiếu nút bí danh với tên "mặc định". Việc <<:chèn nội dung của nút đó.

Cho phép tôi trích dẫn thông số YAML ở đây:

Các nút (đối tượng) lặp đi lặp lại được xác định đầu tiên bởi một neo (được đánh dấu bằng ký hiệu - và &) và sau đó được đặt bí danh (được tham chiếu với dấu hoa thị - Rối *) sau đó.

Vì vậy, một phần của ví dụ của bạn

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  <<: *default
  database: test_test

thực sự mở rộng sang

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  adapter: postgresql       # from the "default" alias
  database: test_test       # overridden by the duplicate key

và đồng thời làm cho nút "kiểm tra" cũng có sẵn trong "kiểm tra" bí danh.

Hãy xem đặc tả YAML - 2.2 Cấu trúc để biết thêm chi tiết (hoặc nếu bạn cần các tài liệu moar thậm chí ++: 3.2.2.2. Neo và Bí danh )


2
Tò mò: "test" mở rộng để kiểm tra: & test adapter: postgresql # từ cơ sở dữ liệu bí danh "mặc định": dev_development # từ cơ sở dữ liệu bí danh "mặc định": test_test Hoàn toàn chính xác. "Cơ sở dữ liệu" thứ hai có ghi đè lên tham chiếu từ "* mặc định" không?
Nắm chặt

2
@Gripp Có, khóa cơ sở dữ liệu được khai báo sau khi <<: *defaultghi đè lên nó. Với YAML, nó tạo ra{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
Ông Tao

13

&default có nghĩa là bạn đang gắn nhãn bộ thuộc tính này với một số tên để sử dụng sau

<<: *default có nghĩa là bạn bao gồm tất cả các thuộc tính từ nhóm được gắn nhãn là mặc định


9

Chúng đại diện cho các tham chiếu nút (*) và hợp nhất mảng kết hợp (<<) tham chiếu đến một nút được gắn nhãn bằng thẻ neo (&) - wikipedia

Hãy thử nó trực tuyến .


3

Chúng là một cách để tham chiếu các môi trường mà không phải lặp đi lặp lại các cài đặt tương tự (DRY it up).

test: &test
  <<: *default

&test tạo một tham chiếu đến các cài đặt cụ thể đó.

<<: *default cho biết sử dụng các cài đặt mặc định cho bài kiểm tra

cucumber:
  <<: *test

Vì vậy, bây giờ chúng tôi biết rằng cucumberchúng tôi muốn sử dụng các cài đặt từ test.


2

Nói một cách đơn giản, khái niệm này giống với lớp cơ sở và lớp dẫn xuất.

Trong mẫu lớp cơ sở, bạn đề cập đến tất cả các chi tiết phổ biến với '&', có nghĩa là nó có thể được sử dụng để mở rộng phần yaml khác cần các trường này. Bây giờ khi bạn tạo một phần khác thay thế các giá trị cấu hình của cấu trúc loại 'lớp cơ sở' này, bạn sử dụng '*' cùng với neo lớp cơ sở (nghĩa là phần bắt đầu bằng '&'). Bạn sử dụng '<<:' như khái niệm yaml để thực sự đặt phần 'lớp cơ sở', mà bạn có thể ghi đè sau này.

vsm:
  stub_nsx_mgr: &MGR_CTRL_STUB
    username: ADMIN
    password: $DEFAULT_PASSWORD
    deployment: ovf
    build: $PR_BUILD
    vmnics:
      - network: $MANAGEMENT_NETWORK_0
    vc: vc_0
    ovf_options:
      - --diskMode=$DISKMODE
      - --deploymentOption=$DEPLOYMENT_OPTION
$MGR_0:
    <<: *MGR_CTRL_STUB
    ovf_path_regex: 'appliance.*\.ovf'
    ovf_options:
      - --diskMode=$DISKMODE
      - --deploymentOption=$DEPLOYMENT_OPTION
$CTRL_0:
    <<: *MGR_CTRL_STUB
    ovf_options:
      - --diskMode=$DISKMODE
      - --allowExtraConfig
$CTRL_1:
    *MGR_CTRL_STUB

Nhưng, nếu bạn không muốn ghi đè các trường mở rộng, bạn có thể bỏ qua '<<:'

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.