Bu database.yml dosyasında &, <<, * ne anlama geliyor?


161

Şimdiye kadar ben sadece her parametre açıkça çağrı ile database.yml kullandım, aşağıdaki dosyada anlamadığım bazı karakterleri kullanır. Her satır ve sembol (&, *, <<) ne anlama geliyor, bu dosyayı nasıl okurum?

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production

6
Yml dosyasında, bağlantı parametreleri benzerse, veritabanı bağlantı parametrelerini farklı ortamlarda tekrar tekrar yazmak zorunda kalmazsınız. Burada yukarıda belirtilen durumda, çevre salatalığı test ortamında olduğu gibi tam bağlantı parametrelerini kullanır. Ve üretim ortamı, veritabanı adı dışında gelişimde olduğu gibi bağlantı parametrelerini kullanır. Bu DRY (Kendinizi tekrar etmeyin) kodu gibidir. Lütfen beni düzeltmekten çekinmeyin.
kxhitiz

2
Ayrıca bakınız: yaml.org/type/merge.html
dreftymac

Yanıtlar:


191

&(Senin örneğin içinde işaretleri düğüm için bir takma &defaulttakma adları "varsayılan" olarak geliştirme düğüm) ve *referanslar adı "varsayılan" ile ad verilmiş düğüm. <<:Bu düğüm içeriğini ekler.

Burada YAML spesifikasyonunu alıntılamama izin verin:

Tekrarlanan düğümler (nesneler) ilk önce bir çapa ile (ve işareti - “&” ile işaretlenir) tanımlanır ve daha sonra diğer adlara (yıldız - “*” ile atıfta bulunulur) eklenir.

Yani örneğinizin parçaları

development: &default
  adapter: postgresql
  database: dev_development

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

aslında genişletmek

development: &default
  adapter: postgresql
  database: dev_development

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

ve aynı zamanda "test" düğümünü "test" takma adı altında da kullanılabilir hale getirin.

Göz at 2.2 Yapılar - YAML şartname (: ++ veya hatta dokümanlar moar gerekirse daha detaylı bilgi için 3.2.2.2 Tutturucuları ve diğer adları. )


2
Meraklı: "test", test etmek için genişler: & test adaptörü: postgresql # "varsayılan" takma ad veritabanından: dev_development # "varsayılan" takma ad veritabanından: test_test Tamamen doğru olmak için. İkinci "veritabanı", "* varsayılan" dan başvurulan veritabanını geçersiz kılıyor mu?
Gripp

2
@Gripp Evet, <<: *defaultüzerine yazıldıktan sonra veritabanı anahtarı bildirildi . YAML ile üretiyor{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
Bay Tao

13

&default bu özellik grubunu daha sonra kullanmak üzere bir adla etiketlediğiniz anlamına gelir

<<: *default varsayılan olarak etiketlenmiş gruptaki tüm özellikleri dahil ettiğiniz anlamına gelir


9

Bunlar, bir bağlantı (&) etiketi ile etiketlenmiş bir düğüme başvuran düğüm referanslarını (*) ve ilişkilendirilebilir dizi birleştirmelerini (<<) temsil eder - wikipedia

Kendinizi çevrimiçi deneyin .


3

Aynı ayarları defalarca tekrarlamak zorunda kalmadan ortamlara başvurmanın bir yoludur (KURU yukarı).

test: &test
  <<: *default

&test bu ayarlara bir referans oluşturur.

<<: *default test için varsayılan ayarları kullan diyor

cucumber:
  <<: *test

Şimdi biliyoruz ki cucumberayarları kullanmak istiyoruz test.


2

Basit bir ifadeyle, bu kavram temel ve türetilmiş sınıfa benzer.

Temel sınıf şablonunda, '&' ile tüm ortak ayrıntılardan bahsedersiniz; bu, bu alanlara ihtiyaç duyan diğer yaml bölümünü genişletmek için kullanılabileceği anlamına gelir. Şimdi bu 'temel sınıf' türü yapının yapılandırma değerlerinin üst kümesini oluşturan başka bir bölüm oluşturduğunuzda, temel sınıf çapasıyla birlikte '*' kullanıyorsunuz (yani '&' ile başlayan bölüm). Daha sonra geçersiz kılabileceğiniz 'temel sınıf' bölümünü yerleştirmek için yaml kavramı olarak '<<:' ifadesini kullanırsınız.

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

Ancak, genişletilmiş alanları geçersiz kılmak istemiyorsanız, '<<:' bölümünü atlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.