Jadi saya memiliki dua file YAML, "A" dan "B" dan saya ingin konten A dimasukkan di dalam B, baik disambungkan ke struktur data yang ada, seperti array, atau sebagai anak elemen, seperti nilai untuk kunci hash tertentu.
Apakah ini mungkin? Bagaimana? Jika tidak, ada petunjuk ke referensi normatif?
yaml
transclusion
kch
sumber
sumber
Jawaban:
Tidak, YAML tidak termasuk pernyataan "impor" atau "sertakan".
sumber
Pertanyaan Anda tidak meminta solusi Python, tapi di sini ada satu yang menggunakan PyYAML .
PyYAML memungkinkan Anda untuk melampirkan konstruktor khusus (seperti
!include
) ke loader YAML. Saya telah memasukkan direktori root yang dapat diatur sehingga solusi ini mendukung referensi file relatif dan absolut.Solusi Berbasis Kelas
Ini adalah solusi berbasis kelas, yang menghindari variabel root global dari respons awal saya.
Lihat inti ini untuk solusi Python 3 yang serupa dan lebih kuat yang menggunakan metaclass untuk mendaftarkan konstruktor kustom.
Sebuah contoh:
foo.yaml
bar.yaml
Sekarang file dapat dimuat menggunakan:
sumber
include
fungsi dapat disederhanakan: `def include (loader, node):" "" Sertakan file YAML lain. "" "Filename = loader.construct_scalar (node) data = yaml.load (buka (nama file))`a: bla
bar.yaml: `! Sertakan foo.yaml b: blubb` Sehingga hasilnya adalah:` {'a': bla, 'b': blubb}Jika Anda menggunakan YAML versi Symfony , ini dimungkinkan, seperti ini:
sumber
Termasuk tidak secara langsung didukung di YAML sejauh yang saya tahu, Anda harus menyediakan mekanisme sendiri, namun ini umumnya mudah dilakukan.
Saya telah menggunakan YAML sebagai bahasa konfigurasi di aplikasi python saya, dan dalam hal ini sering mendefinisikan konvensi seperti ini:
Kemudian dalam kode (python) saya saya lakukan:
Satu-satunya sisi negatifnya adalah bahwa variabel dalam menyertakan akan selalu menimpa variabel di utama, dan tidak ada cara untuk mengubah prioritas itu dengan mengubah di mana "pernyataan: pernyataan muncul di file main.yml.
Pada titik yang sedikit berbeda, YAML tidak mendukung termasuk karena tidak benar-benar dirancang sebagai eksklusif sebagai mark up berbasis file. Apa yang dimaksud dengan menyertakan jika Anda mendapatkannya sebagai tanggapan terhadap permintaan AJAX?
sumber
Untuk pengguna Python, Anda dapat mencoba pyyaml-include .
Install
Pemakaian
Anggap kami memiliki file YAML tersebut :
1.yaml
konten:2.yaml
konten:Sertakan file dengan nama
Di tingkat atas:
Jika
0.yaml
tadinya:Kita akan mendapatkan:
Dalam pemetaan:
Jika
0.yaml
tadinya:Kita akan mendapatkan:
Berurutan:
Jika
0.yaml
tadinya:Kita akan mendapatkan:
Sertakan file dengan wildcard
Nama file dapat berisi wildcard gaya-shell. Data yang diambil dari file yang ditemukan oleh wildcard akan diatur secara berurutan.
Jika
0.yaml
tadinya:Kita akan mendapatkan:
Untuk mengaktifkan
recursive
argumen, kami akan menulis!include
tag dalamMapping
atauSequence
mode:Sequence
mode:Mapping
mode:sumber
Memperluas jawaban @ Josh_Bode, inilah solusi PyYAML saya sendiri, yang memiliki keuntungan menjadi subclass mandiri
yaml.Loader
. Itu tidak tergantung pada global tingkat modul, atau pada memodifikasi keadaan globalyaml
modul.sumber
yaml.load(f, IncludeLoader)
dalam_include
Anda dapat menghindari harus mengganti root. Selain itu, kecuali Anda melakukan ini, solusinya tidak akan bekerja lebih dari satu level karena data yang disertakan menggunakanyaml.Loader
kelas reguler .root
darikwargs
setelah pengaturanself.root
untuk membuatnya bekerja dengan string. Saya memindahkan blok if-else di atassuper
panggilan. Mungkin orang lain dapat mengkonfirmasi temuan saya atau menunjukkan kepada saya bagaimana menggunakan kelas dengan string danroot
parameter.Saya membuat beberapa contoh untuk referensi Anda.
keluaran
Perbarui 2
dan Anda dapat menggabungkannya, seperti ini
sumber
Sayangnya YAML tidak menyediakan ini dalam standarnya.
Tetapi jika Anda menggunakan Ruby, ada permata yang menyediakan fungsionalitas yang Anda minta dengan memperluas pustaka ruby YAML: https://github.com/entwanderer/yaml_extend
sumber
Saya pikir solusi yang digunakan oleh @ maxy-B tampak hebat. Namun, itu tidak berhasil bagi saya dengan inklusi bersarang. Misalnya jika config_1.yaml menyertakan config_2.yaml, yang mencakup config_3.yaml ada masalah dengan loader. Namun, jika Anda cukup mengarahkan kelas loader baru ke dirinya sendiri pada beban, itu berhasil! Secara khusus, jika kita mengganti fungsi _include lama dengan versi yang sedikit dimodifikasi:
Pada refleksi saya setuju dengan komentar lain, bahwa pemuatan bersarang tidak sesuai untuk yaml secara umum karena aliran input mungkin bukan file, tetapi sangat berguna!
sumber
Standar YML tidak menentukan cara untuk melakukan ini. Dan masalah ini tidak membatasi dirinya ke YML. JSON memiliki keterbatasan yang sama.
Banyak aplikasi yang menggunakan konfigurasi berbasis YML atau JSON akhirnya mengalami masalah ini. Dan ketika itu terjadi, mereka membuat konvensi mereka sendiri .
misalnya untuk definisi API sombong:
misalnya untuk konfigurasi penulisan buruh pelabuhan:
Atau, jika Anda ingin membagi konten file yml dalam banyak file, seperti pohon konten, Anda dapat menentukan konvensi struktur folder Anda sendiri dan menggunakan skrip gabungan (yang sudah ada).
sumber
Mungkin ini bisa menginspirasi Anda, cobalah untuk menyelaraskan ke konvensi jbb:
https://docs.openstack.org/infra/jenkins-job-builder/definition.html#inclusion-tags
- job: name: test-job-include-raw-1 builders: - shell: !include-raw: include-raw001-hello-world.sh
sumber
Standar YAML 1.2 tidak termasuk fitur ini. Namun demikian banyak implementasi menyediakan beberapa ekstensi untuk melakukannya.
Saya menyajikan cara mencapainya dengan Java dan
snakeyaml:1.24
(perpustakaan Java untuk mem-parsing / memancarkan file YAML) yang memungkinkan membuat tag YAML khusus untuk mencapai tujuan berikut (Anda akan melihat saya menggunakannya untuk memuat suite pengujian yang ditentukan dalam beberapa file YAML dan saya membuatnya berfungsi sebagai daftar menyertakan untuktest:
simpul target ):Berikut ini adalah Java satu kelas yang memungkinkan pemrosesan
!include
tag. File diambil dari classpath (direktori sumber Maven):sumber
Dengan Yglu , Anda dapat mengimpor file lain seperti ini:
A.yaml
B.yaml
Seperti
$import
fungsi, Anda juga bisa memberikan ekspresi sebagai argumen:Ini akan memberikan hasil yang sama seperti di atas.
Penafian: Saya adalah penulis Yglu.
sumber
Dengan Symfony , penanganan yamlnya secara tidak langsung akan memungkinkan Anda untuk membuat sarang file yaml. Caranya adalah dengan memanfaatkan
parameters
opsi. misalnya:common.yml
config.yml
Hasilnya akan sama dengan:
sumber
Mungkin itu tidak didukung ketika pertanyaan diajukan tetapi Anda dapat mengimpor file YAML lainnya menjadi satu:
Meskipun saya tidak punya referensi online tetapi ini bekerja untuk saya.
sumber
imports
.