Συγχώνευση hashes σε YAML αρχεία conf
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 ή κάτι άλλο. Αλλά αυτό είναι η κλήση σας ούτως ή άλλως.
Σχόλια
- dogging
- søgemaskineoptimering
- Benjamin «balupton" Lupton



































