2015-07-28 16 views
9

obecnie używam Sidekiq w projekcie i mam następujący plik konfiguracyjny YAML:Colon z przodu: składnia YAML

:concurrency: 5 
:pidfile: /tmp/pids/sidekiq.pid 
:logfile: log/sidekiq.log 
staging: 
    :concurrency: 10 
production: 
    :concurrency: 20 
queues: 
    - default 

nie widziałem o dwukropek przed klucza wcześniej, ale pominięcie, że okrężnica daje interesujące wyniki. Na przykład w przypadku :pidfile:, z dwukropkiem z przodu tworzy/przesłania plik docelowy, który jest bez niego, korzysta z tego, który już istnieje i nie zapisuje do niego.

Czy jest to gdzieś udokumentowane, czy w ten sposób Sidekiq spodziewa się pewnych kluczy?

Odpowiedz

11

klucze YAML zaczynające się okrężnicy generować symbolizowane klucze Ruby, natomiast klucze bez okrężnicy generuje stringified klawiszy:

require 'yaml' 

string =<<-END_OF_YAML 
:concurrency: 5 
:pidfile: /tmp/pids/sidekiq.pid 
:logfile: log/sidekiq.log 
staging: 
    :concurrency: 10 
production: 
    :concurrency: 20 
queues: 
    - default 
END_OF_YAML 

YAML.load(string) 
# { 
#  :concurrency => 5, 
#  :pidfile  => "/tmp/pids/sidekiq.pid", 
#  :logfile  => "log/sidekiq.log", 
#  "staging" => { 
#   :concurrency => 10 
#  }, 
#  "production" => { 
#   :concurrency => 20 
#  }, 
#  "queues"  => [ 
#   [0] "default" 
#  ] 
# } 

Uwaga: Jeśli klejnot zależy od kluczy symbolizowanych, klucze usztywnione nie zastąpią jego wartości domyślnych.

+0

Plus jeden dla kluczy symbolizowanych. Nigdy wcześniej nie widziałem tego w Ruby, ale widziałem miejsca, w których symbol jest wymagany jako klucz. Dobrze wiedzieć – TheJKFever

+0

Rozumiem, jak to zachowuje się w Ruby ... ale jeśli chodzi o syntaktyczny YAML, to zasadne jest uruchamianie klucza z dwukropkiem, a to tylko interpreter Ruby, który generuje symbole z kluczy, które zaczynają się od dwukropek? – Brian

3

To w rzeczywistości nie jest specyficzne dla sidekiq. Dwukropek przed klucza właśnie sprawia, że ​​ten klucz jest symbolem zamiast napisu:

# example.yml 
a: 
    value: 1 
:b: 
    value: 2 


yaml = YAML.load_file('example.yml') 

yaml["a"] => { "value" => 1 } 
yaml[:b] => { "value" => 1 } 

Więc jeśli Twój kod dostępu config z najważniejszych symboli, należy dodać do niej dwukropek przed klucza w YAML pliku, lub pewna przemiana kluczy jak #with_indifferent_access do mieszania wyniku (po analizowania pliku yaml)

+0

Dzięki! Poprawiłem odpowiedź. –

+0

, więc jest to zachowanie specyficzne dla ruby ​​i nie jest używane przez inne języki, prawda? – Tony