Así que tengo dos archivos YAML, "A" y "B" y quiero que el contenido de A se inserte dentro de B, ya sea empalmado en la estructura de datos existente, como una matriz, o como un elemento secundario de un elemento, como el valor para una determinada clave hash.
¿Es esto posible en absoluto? ¿Cómo? Si no, ¿algún puntero a una referencia normativa?
yaml
transclusion
kch
fuente
fuente
Respuestas:
No, YAML no incluye ningún tipo de declaración de "importación" o "inclusión".
fuente
Su pregunta no solicita una solución de Python, pero aquí hay una que usa PyYAML .
PyYAML le permite adjuntar constructores personalizados (como
!include
) al cargador YAML. He incluido un directorio raíz que se puede configurar para que esta solución admita referencias de archivo relativas y absolutas.Solución basada en clase
Aquí hay una solución basada en clases, que evita la variable raíz global de mi respuesta original.
Vea este resumen para una solución Python 3 similar y más robusta que utiliza una metaclase para registrar el constructor personalizado.
Un ejemplo:
foo.yaml
bar.yaml
Ahora los archivos se pueden cargar usando:
fuente
include
función puede simplificarse: `def include (loader, node):" "" Incluir otro archivo YAML. "" "Filename = loader.construct_scalar (node) data = yaml.load (open (filename))`a: bla
bar.yaml: `! Include foo.yaml b: blubb` Para que el resultado sea:` {'a': bla, 'b': blubb}Si está utilizando la versión de Symfony de YAML , esto es posible, así:
fuente
Por lo que yo sé, las inclusiones no son directamente compatibles con YAML, tendrá que proporcionar un mecanismo usted mismo, sin embargo, esto generalmente es fácil de hacer.
He usado YAML como lenguaje de configuración en mis aplicaciones de Python, y en este caso a menudo defino una convención como esta:
Luego en mi código (python) hago:
El único inconveniente es que las variables en las inclusiones siempre anularán las variables en main, y no hay forma de cambiar esa precedencia cambiando dónde aparece la instrucción "include:" en el archivo main.yml.
En un punto ligeramente diferente, YAML no es compatible, ya que no está realmente diseñado tan exclusivamente como un marcado basado en archivos. ¿Qué significaría un include si lo recibiste en respuesta a una solicitud de AJAX?
fuente
Para usuarios de Python, puedes probar pyyaml-include .
Instalar en pc
Uso
Considere que tenemos tales archivos YAML :
1.yaml
contenido de:2.yaml
contenido de:Incluir archivos por nombre
En el nivel superior:
Si
0.yaml
fue:Nosotros recibiremos:
En mapeo:
Si
0.yaml
fue:Nosotros recibiremos:
En secuencia:
Si
0.yaml
fue:Nosotros recibiremos:
Incluir archivos por comodines
El nombre del archivo puede contener comodines de estilo shell. Los datos cargados de los archivos encontrados por comodines se establecerán en una secuencia.
Si
0.yaml
fue:Nosotros recibiremos:
Para habilitar el
recursive
argumento, escribiremos la!include
etiqueta enMapping
oSequence
modo:Sequence
modo:Mapping
modo:fuente
Ampliando la respuesta de @ Josh_Bode, aquí está mi propia solución PyYAML, que tiene la ventaja de ser una subclase autónoma de
yaml.Loader
. No depende de ningún nivel global deyaml
módulo o de modificar el estado global del módulo.fuente
yaml.load(f, IncludeLoader)
dentro_include
, puedes evitar tener que reemplazar la raíz. Además, a menos que haga esto, la solución no funcionará a más de un nivel de profundidad ya que los datos incluidos utilizan layaml.Loader
clase regular .root
dekwargs
después de ajustarself.root
para que funcione con cuerdas. Moví el bloque if-else encima de lasuper
llamada. Quizás alguien más pueda confirmar mi hallazgo o mostrarme cómo usar la clase con cadenas y elroot
parámetro.Hago algunos ejemplos para su referencia.
salida
Actualización 2
y puedes combinarlo así
fuente
Desafortunadamente, YAML no proporciona esto en su estándar.
Pero si está utilizando Ruby, hay una gema que proporciona la funcionalidad que está solicitando al extender la biblioteca ruby YAML: https://github.com/entwanderer/yaml_extend
fuente
Creo que la solución utilizada por @ maxy-B se ve muy bien. Sin embargo, no tuvo éxito para mí con inclusiones anidadas. Por ejemplo, si config_1.yaml incluye config_2.yaml, que incluye config_3.yaml, hubo un problema con el cargador. Sin embargo, si simplemente apunta la nueva clase de cargador a sí misma en la carga, ¡funciona! Específicamente, si reemplazamos la antigua función _include con la versión ligeramente modificada:
Después de reflexionar, estoy de acuerdo con los otros comentarios, que la carga anidada no es apropiada para yaml en general, ya que la secuencia de entrada puede no ser un archivo, ¡pero es muy útil!
fuente
El estándar YML no especifica una forma de hacer esto. Y este problema no se limita a YML. JSON tiene las mismas limitaciones.
Muchas aplicaciones que usan configuraciones basadas en YML o JSON se topan con este problema eventualmente. Y cuando eso sucede, inventan su propia convención. .
por ejemplo, para definiciones de API swagger:
Por ejemplo, para las configuraciones de composición de Docker:
Alternativamente, si desea dividir el contenido de un archivo yml en varios archivos, como un árbol de contenido, puede definir su propia convención de estructura de carpetas y usar un script de fusión (existente).
fuente
Tal vez esto pueda inspirarte, intenta alinearte con las convenciones de 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
fuente
YAML 1.2 estándar no incluye de forma nativa esta función. Sin embargo, muchas implementaciones proporcionan alguna extensión para hacerlo.
Presento una forma de lograrlo con Java y
snakeyaml:1.24
(biblioteca Java para analizar / emitir archivos YAML) que permite crear una etiqueta YAML personalizada para lograr el siguiente objetivo (verá que lo estoy usando para cargar conjuntos de pruebas definidos en varios archivos YAML y que lo hice funcionar como una lista de incluye para untest:
nodo de destino ):Aquí está el Java de una clase que permite procesar la
!include
etiqueta. Los archivos se cargan desde classpath (directorio de recursos de Maven):fuente
Con Yglu , puede importar otros archivos como este:
A.yaml
B.yaml
Como
$import
es una función, también puede pasar una expresión como argumento:Esto daría el mismo resultado que el anterior.
Descargo de responsabilidad: soy el autor de Yglu.
fuente
Con Symfony , su manejo de yaml le permitirá indirectamente anidar archivos yaml. El truco es hacer uso de la
parameters
opción. p.ej:common.yml
config.yml
El resultado será el mismo que:
fuente
Probablemente no fue compatible cuando se hizo la pregunta, pero puede importar otro archivo YAML en uno:
Aunque no tengo ninguna referencia en línea, pero esto funciona para mí.
fuente
imports
.