Συγχώνευση hashes σε YAML αρχεία conf

31ης Ιουλίου, 2009 από Prashant
Filed under: Τεχνολογία

YAML είναι πολύ βολικό για το γράψιμο αρχεία ρυθμίσεων. Πρωτοβάθμια πλεονέκτημα είναι ότι, όπως διαβάζει το αρχείο κειμένου. Αυτό λειτουργεί πολύ καλά, αν το αρχείο ρυθμίσεων σας είναι επίπεδη (χωρίς ιεραρχία) και δεν έχει επαναλήψεις.
Αν διαμορφώσεις το αρχείο σας έχει επαναλήψεις τότε είναι λογικό να διαχωριστούν από τα στοιχεία αυτά και την επαναχρησιμοποίηση τους. Αυτό που εννοώ είναι αυτό - ας πούμε ότι έχετε το αρχείο ρυθμίσεων σας μοιάζει με αυτό:

  ανάπτυξη:
   input_location: common_input
   output_location: dev_location
   ταχυδρομείο:
     smtp_server: your_server
     Σύνδεση: your_login
     κωδικός: top_secret
 παραγωγή:
   input_location: common_input
   output_location: dev_location
   ταχυδρομείο:
     smtp_server: your_server
     Σύνδεση: your_login
     κωδικός: top_secret 

Υποθέτοντας παραπάνω κώδικα στο / tmp / test.yml εδώ είναι το πώς μπορείτε να διαβάσετε σε python και ρουμπίνι
$cat readyml.py

 #! / Usr / bin / env python
 από την εισαγωγή pprint pprint ως σελ.
 # Στο Debian χρειάζεται να εγκαταστήσετε την Python-YAML
 από YAML φορτίο εισαγωγής, load_all, χωματερή
 hash = φορτίο (ανοιχτή («/ tmp / test.yml '))
 PP (hash [«ανάπτυξη»]) 


$ cat readyml.rb

  #! / Usr / bin / env ρουμπίνι
 απαιτούν «PP»
 hash = YAML :: φορτίο (File.open ('/ tmp / test.yml »). read)
 PP κατακερματισμού [«ανάπτυξη»] 

Εδώ είναι ένα εύχρηστο ένα σκάφος της γραμμής για την έκδοση ρουμπίνι
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' ή μπορείτε να δοκιμάσετε την ίδια σε IRB ή κονσόλα Python.

Σημειώστε ότι στο παραπάνω απόσπασμα κώδικα, τα πάντα είναι άλλη από την τοποθεσία παραγωγής είναι ίδια στην ανάπτυξη και μέρος της παραγωγής. Αυτό είναι όπου YML αναγνωριστικό κόμβος έρχεται να διασώσει. Η ιδέα είναι απλή έχουν μια σειρά από προκαθορισμένες τιμές και τους αντικαθιστούν σε διαφορετικό μέρος.
Θα μπορούσατε να το τραβήξει πέρα ​​ως εξής:

  προεπιλογών: προεπιλογές &
   input_location: common_input
   output_location: dev_location
   ταχυδρομείο:
     SENDER_NAME: αποστολέα
     smtp_server: your_server
     Σύνδεση: your_login
     κωδικός: top_secret
 ανάπτυξη:
   <<: * Προεπιλογές
 παραγωγή:
   <<: * Προεπιλογές
   output_location: prod_location 


$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Μεγάλη, λειτουργεί (tm)!.
Θα μπορούσαμε να πούμε διαπραγματεύονται κάποια σαφήνεια για ένα κομμάτι της μαγείας. Εδώ είναι μια μικρή εξήγηση: &, και << *: και η οποία είναι άγκυρα tag μπορεί να θεωρηθεί ως κόμβος αναγνωριστικό, είναι ο κόμβος * αναφοράς και <<: σημαίνει κατακερματισμού συγχώνευσης.

Για περισσότερες λεπτομέρειες, βλ. είτε YAML προδιαγραφές ή wikipedia
Μέχρι εδώ όλα καλά, αλλά υπάρχει ένα πρόβλημα εδώ, αυτές οι συγχωνεύσεις χασίς δεν είναι αναδρομική. Αυτό που σημαίνει είναι το εξής: ας υποθέσουμε ότι θέλετε να έχετε διαφορετικό όνομα αποστολέα για αλληλογραφία σε δύο περιβάλλοντα, μπορείτε να μπείτε στον πειρασμό να κάνετε τα εξής:

  προεπιλογών: προεπιλογές &
   input_location: common_input
   output_location: dev_location
   ταχυδρομείο:
     SENDER_NAME: αποστολέα
     smtp_server: your_server
     Σύνδεση: your_login
     κωδικός: top_secret
 ανάπτυξη:
   <<: * Προεπιλογές
   ταχυδρομείο:
     SENDER_NAME: sender_dev
 παραγωγή:
   <<: * Προεπιλογές
   output_location: prod_location
   ταχυδρομείο:
     SENDER_NAME: sender_prod 

Αφήνει να ελέγξετε

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$

Ωχ, κάτι πήγε στραβά, το πρόβλημα όπως προαναφέρθηκε είναι ότι η συγχώνευση δεν κατακερματισμού είναι αναδρομική και κατά τη συγχώνευση αλληλογραφίας αντικατέστησε αθέτησης μέσω ταχυδρομείου της παραγωγής, η οποία έχει μόνο ένα πλήκτρο. Λύση / εργασία είναι γύρω να ξεδιπλώνουν ένα ακόμη επίπεδο:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: αποστολέα
   smtp_server: your_server
   Σύνδεση: your_login
   κωδικός: top_secret

 προεπιλογών: προεπιλογές &
   <<: * Common_settings
   ταχυδρομείο:
     <<: * Mail_defaults
 ανάπτυξη:
   <<: * Προεπιλογές
 παραγωγή:
   <<: * Προεπιλογές
   ταχυδρομείο:
     <<: * Mail_defaults
     SENDER_NAME: sender_prod

Αφήνει να ελέγξετε και πάλι

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Μήπως λέτε ότι έχετε ένα ακόμα επίπεδο ένθεσης, και μπορείτε να επεκταθούν σίγουρα ένα πιο επίπεδο, αλλά στη συνέχεια γίνεται ένα χάος. Έτσι, αν δεν προσπαθεί να γράψει λύση με τους πύργους του Ανόι σε ένα conf αρχείο, είναι καλύτερα να restucture conf αρχείο από το σκάψιμο σε YAML ή κάτι άλλο. Αλλά αυτό είναι η κλήση σας ούτως ή άλλως.

Σχόλια

  • Το πλήρες 453 σελίδων έγγραφο που παραθέτει, επίσης, πιθανοί τομείς
    ενοποίηση, συμπεριλαμβανομένης της ιδιωτικοποίησης pickup σκουπίδια, τη συγχώνευση και την πόλη
    Ο Wayne County υπηρεσίες υγείας και τη συνεργασία με Ντιτρόιτ Δημόσια Σχολεία για
    αναψυχής. Η πρόταση δεν περιλαμβάνει καμία ...

  • Ένα πρόσωπο εξοικειωμένο με τη συμφωνία ότι οι δύο πλευρές εξακολουθούν να έχουν hash είναι ένα όνομα για την συγχωνευθείσα εταιρεία. Αλλά αυτός ο άνθρωπος είπε μια ιδέα που εξετάζεται είναι η επιλογή ενός ονόματος που δεν έχουν τη λέξη "Deutsche" ή το ακρωνύμιο "NYSE" σε αυτό. ...

  • Ναι ενοχλητικό δεν συγχώνευση αναδρομικά. Ήμουν σε θέση να κάνουν μια λύση στο balphp βιβλιοθήκη μου.

blog παρατηρήσεις που κινούνται με Disqus