Workspaces do Structurizr Divididos em Vários Arquivos Agora Podem Ser Importados no Archyl
Alguns workspaces do Structurizr guardam quase nada em workspace.dsl. Um cabeçalho, um bloco model e uma coluna de linhas !include, uma por sistema, com o modelo de verdade espalhado pelos arquivos para os quais elas apontam.
Até esta semana, o Archyl não conseguia importar isso. Nosso post de 4 de agosto sobre o encerramento do Structurizr Cloud dizia isso em uma linha: workspaces com vários arquivos precisavam ser achatados antes. Isso excluía os workspaces que mantêm cada sistema no seu próprio arquivo. O Structurizr Cloud encerra em 30 de setembro, daqui a duas semanas.
Agora você pode enviar o workspace como .zip, e o Archyl resolve cada !include a partir dos arquivos que estão dentro dele.
Por que um único arquivo nunca ia funcionar
Pegue um workspace organizado assim:
workspace.dsl
model/
people.dsl
relationships.dsl
systems/
ledger.dsl
notifications.dsl
payments.dsl
com um arquivo raiz que só junta as partes:
workspace "Payments Platform" "Card payments and settlement" {
model {
!include model/people.dsl
!include systems
!include model/relationships.dsl
}
}
Envie ou cole esse arquivo raiz sozinho e o importador não tem a partir de que resolver os caminhos. Ele faz o parsing do que tem, pula cada include e avisa você:
line 3: directive '!include' is not supported and was skipped
line 4: directive '!include' is not supported and was skipped
line 5: directive '!include' is not supported and was skipped
Os avisos estão corretos, e também são o resultado inteiro: nada daqueles seis arquivos está nele. Um único arquivo .dsl autocontido continua sendo importado exatamente como antes. O zip é para todo o resto.
Compacte o diretório do workspace, não o repositório
Se o seu workspace usa !include, os arquivos separados existem como arquivos em algum lugar. A documentação de includes do Structurizr descreve um include de arquivo como "a single local file, specified by a relative path" — um único arquivo local, especificado por um caminho relativo. Então a cópia que importa está em um disco ou no Git, não na nuvem. Encontre o diretório que contém workspace.dsl e compacte esse.
De dentro do diretório:
zip -r workspace.zip workspace.dsl model systems
Ou, se o workspace fica em um repositório, direto de um commit:
git archive --format=zip -o workspace.zip HEAD:docs/architecture
A diferença importa porque o arquivo compactado é limitado a 500 entradas, e essa contagem é verificada antes de qualquer filtragem. Compacte um repositório inteiro com a pasta .git e você pode passar do limite antes que um único arquivo .dsl seja lido. Uma pasta envolvendo tudo no nível superior do zip não é problema, já que os includes são resolvidos em relação ao arquivo que faz o include.
O que acontece quando você envia
No modal de importação, o botão da aba Structurizr DSL agora diz Enviar .dsl ou .zip. Escolha um zip e o editor de código é substituído por um card com o nome e o tamanho dele. Clique em Validar e o card passa a mostrar também a quantidade de arquivos e o arquivo raiz escolhido.
Isso funciona tanto ao importar para um projeto existente quanto ao criar um novo. Um projeto novo recebe o nome a partir do cabeçalho do workspace, então workspace "Payments Platform" { ... } consegue criar um projeto e um workspace { ... } sem nome não consegue.
No servidor, o zip passa por quatro etapas:
- Escolher a raiz.
workspace.dslse o zip tiver um; caso contrário, o arquivo.dslmenos profundo. Quando precisa escolher entre vários arquivos e nenhum se chamaworkspace.dsl, um aviso informa o arquivo usado. - Expandir os includes como texto, antes do parsing. O conteúdo do arquivo incluído substitui a linha
!include, o mesmo inlining que o Structurizr faz. Os caminhos são relativos ao arquivo que faz o include, entãosystems/index.dslincluindoshared/platform.dslencontrasystems/shared/platform.dsl. - Resolver includes de diretório.
!include systemstraz cada arquivo.dslque está diretamente dentro desystems/, em ordem de nome. Subdiretórios não são percorridos. - Parar nas bordas. Um arquivo que acaba incluindo a si mesmo, diretamente ou por meio de outro arquivo, tem o ciclo quebrado e reportado. O aninhamento para em 10 níveis.
Depois, o workspace expandido passa pelo mesmo importador do Structurizr que um arquivo único, com a mesma fidelidade e a mesma lista de avisos para tudo o que for pulado.
Um include que não pode ser resolvido, como um arquivo ausente ou um caminho apontando para fora do zip, também vira um aviso. O restante do workspace é importado mesmo assim.
Includes remotos são recusados de propósito
O Structurizr também permite que !include aponte para uma URL HTTPS. O Archyl não segue essas URLs. Resolvê-las deixaria qualquer arquivo enviado fazer nossos servidores requisitarem um endereço escolhido por ele, o que é um vetor de server-side request forgery, não importa quem envie. A linha é pulada com um aviso:
!include: remote target "https://example.com/shared/identity.dsl" is not supported and was skipped
Se o arquivo remoto contém elementos do modelo de que você precisa, baixe-o para dentro do zip e troque a linha por um caminho relativo.
Os limites
| Limite | Valor | Quando excedido |
|---|---|---|
| Tamanho do zip | 10 MiB | Envio recusado |
| Entradas no zip | 500 | Envio recusado |
| Tamanho total depois de expandido | 50 MiB | Envio recusado |
| Qualquer arquivo individual | 5 MiB | Arquivo pulado, com um aviso |
| Aninhamento de includes | 10 níveis | Include mais profundo pulado, com um aviso |
Entradas cujo caminho tenta escapar do zip, por meio de um caminho absoluto ou de segmentos .., são puladas com um aviso. Só arquivos de texto são mantidos: .dsl, .md, .json, .yaml, .yml e .txt. Imagens e todo o resto são descartados sem aviso, já que o importador de DSL não tem uso para eles.
O que ainda não faz
A sincronização com Git não resolve includes. A sincronização de repositórios lê archyl.yaml, não um workspace do Structurizr, então ainda não existe um caminho pelo qual o Archyl puxe um DSL com vários arquivos direto de um repositório. Se o seu DSL fica no Git, o comando git archive acima é o fluxo de trabalho por enquanto.
Nada mais mudou na fidelidade ao Structurizr. Layout, estilos e deployment views não eram importados antes e não são importados a partir de um zip. Também continua não existindo um caminho para workspace.json: o Archyl lê texto DSL. Se o que você mais valoriza no Structurizr é o layout ajustado à mão, as opções do post sobre o encerramento que mantêm você no tooling do próprio Structurizr continuam sendo a melhor escolha.
Antes de 30 de setembro
- Garanta que você tem os arquivos-fonte. Um workspace dividido com
!includefoi escrito como arquivos, então encontre-os. Se algo existe só na cópia na nuvem, como um layout ajustado no navegador ou documentação escrita lá, o post de 4 de agosto explica como tirar isso de lá. - Compacte o diretório que contém
workspace.dsl, não o repositório em volta dele. - Envie e valide. Abra Import Project, ou o modal de importação dentro de um projeto existente, escolha Structurizr DSL, envie o zip e clique em Validar. Confira o arquivo raiz escolhido e leia cada aviso antes de importar.
- Faça commit do diretório em um repositório se ele ainda não estiver em um, para que a próxima pessoa não precise procurá-lo no seu notebook.
O comportamento completo do importador, incluindo as regras de nome para projetos novos, está na documentação de Architecture as Code. Para os outros formatos que o Archyl importa, veja importar projetos do Structurizr, LikeC4 e IcePanel.