Então, eu tenho dois arquivos YAML, "A" e "B" e quero que o conteúdo de A seja inserido dentro de B, emendado na estrutura de dados existente, como uma matriz ou como filho de um elemento, como o valor para uma determinada chave de hash.
Isso é possível em tudo? Quão? Caso contrário, algum ponteiro para uma referência normativa?
yaml
transclusion
kch
fonte
fonte
Respostas:
Não, o YAML não inclui nenhum tipo de declaração "import" ou "include".
fonte
Sua pergunta não pede uma solução Python, mas aqui está uma usando PyYAML .
O PyYAML permite anexar construtores personalizados (como
!include
) ao carregador YAML. Incluí um diretório raiz que pode ser definido para que esta solução suporte referências de arquivo relativas e absolutas.Solução baseada em classe
Aqui está uma solução baseada em classe, que evita a variável raiz global da minha resposta original.
Veja esta essência para uma mais robusta solução semelhante, Python 3 que usa um metaclass para registrar o construtor personalizado.
Um exemplo:
foo.yaml
bar.yaml
Agora os arquivos podem ser carregados usando:
fonte
include
função possa ser simplificado: `def include (loader, node):" "" Inclua outro arquivo YAML. "" "Filename = loader.construct_scalar (node) data = yaml.load (open (filename))`a: bla
bar.yaml: `! Inclua foo.yaml b: blubb` Para que o resultado seja:` {'a': bla, 'b': blubb}Se você estiver usando a versão do YAML do Symfony , isso é possível, assim:
fonte
As inclusões não são diretamente suportadas no YAML, tanto quanto eu sei, você precisará fornecer um mecanismo, no entanto, isso geralmente é fácil de fazer.
Eu usei o YAML como uma linguagem de configuração nos meus aplicativos python e, nesse caso, frequentemente defina uma convenção como esta:
Então, no meu código (python), eu faço:
A única desvantagem é que as variáveis no include sempre substituem as variáveis no main e não há como alterar essa precedência alterando onde a instrução "includes: aparece no arquivo main.yml.
Em um ponto um pouco diferente, o YAML não suporta inclusões, pois não foram realmente projetadas tão exclusivamente quanto uma marcação baseada em arquivo. O que um include incluiria se você o obtivesse em resposta a uma solicitação AJAX?
fonte
Para usuários do Python, você pode tentar pyyaml-include .
Instalar
Uso
Considere que temos esses arquivos YAML :
1.yaml
conteúdo:2.yaml
conteúdo:Incluir arquivos por nome
No nível superior:
Se
0.yaml
foi:Nós conseguiremos:
No mapeamento:
Se
0.yaml
foi:Nós conseguiremos:
Em sequência:
Se
0.yaml
foi:Nós conseguiremos:
Incluir arquivos por curingas
O nome do arquivo pode conter curingas no estilo de shell. Os dados carregados dos arquivos encontrados pelos curingas serão definidos em uma sequência.
Se
0.yaml
foi:Nós conseguiremos:
Para habilitar o
recursive
argumento, devemos escrever a!include
tag no modoMapping
ouSequence
:Sequence
modo:Mapping
modo:fonte
Expandindo a resposta de @ Josh_Bode, aqui está minha própria solução PyYAML, que tem a vantagem de ser uma subclasse independente de
yaml.Loader
. Não depende de nenhum global no nível doyaml
módulo ou da modificação do estado global do módulo.fonte
yaml.load(f, IncludeLoader)
dentro,_include
poderá evitar a substituição da raiz. Além disso, a menos que você faça isso, a solução não funcionará mais do que um nível de profundidade, pois os dados incluídos usam ayaml.Loader
classe regular .root
dekwargs
depois de definirself.root
a fazê-lo funcionar com cordas. Movi o bloco if-else acima dasuper
chamada. Talvez alguém possa confirmar minha descoberta ou me mostrar como usar a classe com strings e oroot
parâmetroEu faço alguns exemplos para sua referência.
resultado
Atualização 2
e você pode combiná-lo assim
fonte
Infelizmente, o YAML não fornece isso em seu padrão.
Mas se você estiver usando Ruby, há uma gema fornecendo a funcionalidade que você está solicitando, estendendo a biblioteca YAML do ruby: https://github.com/entwanderer/yaml_extend
fonte
Acho que a solução usada pelo @ maxy-B parece ótima. No entanto, não foi bem-sucedido para mim com inclusões aninhadas. Por exemplo, se config_1.yaml incluir config_2.yaml, que inclui config_3.yaml, houve um problema com o carregador. No entanto, se você simplesmente apontar a nova classe loader para si mesma no carregamento, ela funcionará! Especificamente, se substituirmos a função _include antiga pela versão ligeiramente modificada:
Após refletir, concordo com os outros comentários, que o carregamento aninhado não é apropriado para o yaml em geral, pois o fluxo de entrada pode não ser um arquivo, mas é muito útil!
fonte
O padrão YML não especifica uma maneira de fazer isso. E esse problema não se limita ao YML. JSON tem as mesmas limitações.
Muitos aplicativos que usam configurações baseadas em YML ou JSON acabam enfrentando esse problema. E quando isso acontece, eles formam sua própria convenção .
por exemplo, para definições de API do swagger:
por exemplo, para configurações de composição do docker:
Como alternativa, se você deseja dividir o conteúdo de um arquivo yml em vários arquivos, como uma árvore de conteúdo, pode definir sua própria convenção de estrutura de pastas e usar um script de mesclagem (existente).
fonte
Talvez isso possa inspirar você, tente alinhar-se às convenções 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
fonte
O YAML 1.2 padrão não inclui nativamente esse recurso. No entanto, muitas implementações fornecem alguma extensão para isso.
Apresento uma maneira de alcançá-lo com Java e
snakeyaml:1.24
(biblioteca Java para analisar / emitir arquivos YAML) que permite criar uma tag YAML personalizada para atingir o objetivo a seguir (você verá que eu estou usando-a para carregar conjuntos de testes definidos em vários arquivos YAML e que eu fiz funcionar como uma lista de inclusões para umtest:
nó de destino ):Aqui está o Java de uma classe que permite processar a
!include
tag. Os arquivos são carregados do caminho de classe (diretório de recursos do Maven):fonte
Com o Yglu , você pode importar outros arquivos como este:
A.yaml
B.yaml
Como
$import
é uma função, você também pode passar uma expressão como argumento:Isso daria a mesma saída que acima.
Disclaimer: Eu sou o autor de Yglu.
fonte
Com o Symfony , sua manipulação do yaml indiretamente permitirá aninhar arquivos yaml. O truque é fazer uso da
parameters
opção. por exemplo:common.yml
config.yml
O resultado será o mesmo que:
fonte
Provavelmente não foi suportado quando a pergunta foi feita, mas você pode importar outro arquivo YAML para um:
Embora eu não tenha nenhuma referência on-line, mas isso funciona para mim.
fonte
imports
.