Pular para o conteúdo

Ciclos de import

Por que A → B → A não sobe, como o check mostra a cadeia, e as três formas de quebrá-la.

Um ciclo de import é a.df adotando b.df, que adota a.df. Para carregar a, é preciso b; para carregar b, é preciso a. O check acusa antes de rodar, e mostra a cadeia mais curta — a mais fácil de quebrar.

text
$ dataforge check src/
src/pedidos.df:1:1: erro: import cycle: pedidos.df → clientes.df → pedidos.df
    sugestao: move what both need into a third module

As três saídas#

SaídaQuando
um terceiro módulo com o que os dois precisamquase sempre: o ciclo é um tipo compartilhado morando no lugar errado
passar como argumento em vez de adotarquando só uma ação de b precisa de algo de a
juntar os doisquando eles são, na verdade, um módulo só
dataforge
// ANTES: pedidos.df adota clientes.df, e clientes.df adota pedidos.df
//         porque os dois usam o record Endereco.
//
// DEPOIS:
//   endereco.df   record Endereco            (nao adota ninguem)
//   clientes.df   adopt ./endereco
//   pedidos.df    adopt ./endereco, adopt ./clientes
//
// O grafo virou uma arvore: endereco <- clientes <- pedidos.

record Endereco:
    rua: String
    cidade: String

e := Endereco("Rua A", "Recife")
assert e.cidade is "Recife"
bash
dataforge deps              # o grafo de imports
dataforge check src/        # o ciclo, com a cadeia