ไฟล์ &, <<, * หมายถึงอะไรในไฟล์ database.yml นี้


161

จนถึงตอนนี้ฉันได้ใช้ database.yml กับแต่ละพารามิเตอร์ที่เรียกว่าอย่างชัดเจนเท่านั้นในไฟล์ด้านล่างจะใช้อักขระบางตัวที่ฉันไม่เข้าใจ แต่ละบรรทัดและสัญลักษณ์ (&, *, <<) หมายความว่าอย่างไรฉันจะอ่านไฟล์นี้ได้อย่างไร

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production

6
ในไฟล์ yml คุณไม่จำเป็นต้องเขียนพารามิเตอร์การเชื่อมต่อฐานข้อมูลอีกครั้งและอีกครั้งในสภาพแวดล้อมที่แตกต่างกันหากการเชื่อมต่อเหมือนกัน ที่นี่ในกรณีที่กล่าวถึงข้างต้นแตงกวาสภาพแวดล้อมใช้ params การเชื่อมต่อที่แน่นอนเช่นเดียวกับในสภาพแวดล้อมการทดสอบ และสภาพแวดล้อมการผลิตใช้ params การเชื่อมต่อในการพัฒนายกเว้นชื่อฐานข้อมูล นี่คือรหัส DRY (อย่าทำซ้ำตัวเอง) โปรดแก้ไขให้ฉันด้วย
kxhitiz

2
ดูเพิ่มเติมที่: yaml.org/type/merge.html
dreftymac

คำตอบ:


191

&เครื่องหมายนามแฝงสำหรับโหนด (ในตัวอย่างของคุณ&defaultนามแฝงโหนดพัฒนาเป็น "เริ่มต้น") และ*การอ้างอิงโหนด aliased ที่มีชื่อ "เริ่มต้นที่" <<:แทรกเนื้อหาของโหนดว่า

ให้ฉันพูดอ้างข้อมูลจำเพาะ YAML ที่นี่:

โหนด (วัตถุ) ซ้ำแล้วซ้ำอีกจะถูกระบุโดยสมอ (ทำเครื่องหมายด้วยเครื่องหมายและ - "&") และจากนั้นจะมีนามแฝง (อ้างอิงด้วยเครื่องหมายดอกจัน -“ *”) หลังจากนั้น

ตัวอย่างบางส่วนของคุณ

development: &default
  adapter: postgresql
  database: dev_development

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

จริงขยายไป

development: &default
  adapter: postgresql
  database: dev_development

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

และในเวลาเดียวกันทำให้โหนด "ทดสอบ" พร้อมใช้งานภายใต้นามแฝง "ทดสอบ"

ดูข้อมูลจำเพาะของ YAML - 2.2 โครงสร้างสำหรับรายละเอียดเพิ่มเติม (หรือหากคุณต้องการเอกสาร moar ++ ++: 3.2.2.2. Anchors and Aliases )


2
อยากรู้อยากเห็น: "ทดสอบ" ขยายการทดสอบ: & ทดสอบอะแดปเตอร์: postgresql # จากฐานข้อมูลนามแฝง "เริ่มต้น": dev_development # จากฐานข้อมูลนามแฝง "เริ่มต้น": test_test ให้มีความแม่นยำอย่างสมบูรณ์ "ฐานข้อมูล" อันที่สองจะแทนที่อันที่อ้างอิงจาก "* default" หรือไม่?
Gripp

2
@Gripp ใช่คีย์ฐานข้อมูลที่ประกาศหลังจาก<<: *defaultเขียนทับมัน ด้วยYAMLมันสร้าง{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
นายเต่า

13

&default หมายความว่าคุณกำลังติดป้ายชื่อชุดคุณลักษณะนี้ด้วยชื่อบางอย่างเพื่อใช้ในภายหลัง

<<: *default หมายความว่าคุณรวมแอตทริบิวต์ทั้งหมดจากกลุ่มที่มีป้ายกำกับว่าเป็นค่าเริ่มต้น


9

สิ่งเหล่านี้แสดงถึงการอ้างอิงโหนด (*) และการรวมอาร์เรย์แบบเชื่อมโยง (<<) ที่อ้างถึงโหนดที่มีป้ายกำกับที่มีแท็ก anchor (&) - วิกิพีเดีย

ลองด้วยตัวคุณเองออนไลน์


3

พวกเขาเป็นวิธีการอ้างอิงสภาพแวดล้อมโดยไม่ต้องทำซ้ำการตั้งค่าเดียวกันซ้ำแล้วซ้ำอีก (แห้งขึ้น)

test: &test
  <<: *default

&test สร้างการอ้างอิงถึงการตั้งค่าเฉพาะเหล่านั้น

<<: *default บอกว่าใช้การตั้งค่าเริ่มต้นสำหรับการทดสอบ

cucumber:
  <<: *test

ดังนั้นตอนนี้เรารู้ว่าเราต้องการที่จะใช้การตั้งค่าจากcucumbertest


2

ในคำง่าย ๆ ความคิดนี้คล้ายกับฐานและคลาสที่ได้รับ

ในเทมเพลตคลาสพื้นฐานคุณพูดถึงรายละเอียดทั่วไปทั้งหมดด้วย '&' ซึ่งหมายความว่าสามารถใช้เพื่อขยายส่วน yaml อื่น ๆ ที่ต้องการฟิลด์เหล่านี้ ตอนนี้เมื่อคุณสร้างส่วนอื่นที่เป็น superset ของค่าคอนฟิกของโครงสร้างประเภท 'คลาสคลาส' นี้คุณใช้ '*' พร้อมกับสมอคลาสพื้นฐาน (เช่นส่วนที่เริ่มต้นด้วย '&') คุณใช้ '<<:' เป็นแนวคิด yaml สำหรับการวางส่วน 'คลาสพื้นฐาน' ซึ่งคุณสามารถแทนที่ได้ในภายหลัง

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

แต่ถ้าคุณไม่ต้องการแทนที่เขตข้อมูลส่วนขยายคุณสามารถข้าม '<<:'

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