O que é o Smart Content Dependency Management™?
Resumo
Gerenciamento de Dependência de Conteúdo Inteligente™ é sobre o círculo de ideias relacionadas ao fornecimento de suporte e facilitação para construções incrementais, mantendo-se fiel ao Princípio de Normalização de Conteúdo — que permalinks deve ser a única fonte da verdade, não importa como seu conteúdo seja selecionado em toda a árvore de origem e os artefatos de compilação resultantes.
Este artigo apresenta a https://sunstarsys.com/ website como estudo de caso para uma demonstração das melhores práticas e análise das topologias gráficas associadas.
Cavernas
Isso só importa quando você precisa pesar a despesa de realizar compilações completas do site sempre que precisar ajustar o conteúdo em uma página da web. Se o seu site tiver menos de 1K arquivos de origem, relaxar e ler o seguinte com um olho para suas necessidades futuras. Você escolheu usar nossa plataforma, que foi projetada para escalar com você, não contra você. Para a maioria das páginas, este material abaixo é sobre gráficos de dependência de conteúdo esparso para sites com mais de páginas 1K.
Por exemplo, o Apache https://www.OpenOffice.Org site foi capaz de construir seus arquivos 40K+ usando a versão Apache original deste sistema de compilação, com suporte totalmente integrado para builds incrementais — sem qualquer dependência configurada — usando apenas a tecnologia SSI tradicional.
Por padrão, nosso sistema de compilação irá construir apenas os arquivos que você alterou, sem preocupação com as dependências intra-arquivo (a menos que você especificá-los em %path::dependências — mais sobre isso abaixo). Se o arquivo alterado estiver no modelos/ ou lib/ diretório, uma compilação completa do site será acionada.
Tecelando o Gráfico de Dependência do Seu Site
Matematicamente, uma Topologia é uma especificação completa dos subconjuntos open de um espaço , cujo objetivo é indicar as relações de proximidade entre pontos do espaço . Quando é um gráfico, uma topologia para para especificar as bordas que conectam os vértices do gráfico juntos (aqui os vértices são vistos como os pontos de , e as bordas de conexão determinam os bairros desses pontos como conjuntos abertos basis para a topologia). Uma topologia de gráfico dirigida é essencialmente a mesma coisa, mas incorpora uma referência a uma incorporação topológica de em um espaço topológico maior , onde as conexões de borda da incorporação são representadas por curvas direcionais, não interseccionais (Jordânia).
O último conceito é o que utilizaremos ao discutir a topologia do gráfico de dependência associado ao espaço de arquivos de origem abaixo do seu site conteúdo/ subdiretório (aqui é com sua topologia métrica para e as bordas de são curvas Jordan direcionadas e sem interseção que conectam um arquivo ao seu conjunto de arquivos sobre os quais depende: ).
Tendo uma compreensão clara do gráfico de dependência do seu site *garantirá que você possa maximizar o desempenho da nossa tecnologia de construção em escala. Levamos as informações que você fornece para %path::dependências durante a carga de construção do seu site lib/path.pm arquivo, construir um mapa reverso de arquivos dependentes e usar que mapa reverso para determinar o corpus completo de arquivos para construir para qualquer dado commit svn você faz para o nosso sistema.
É importante observar que as relações de dependência entre os arquivos de origem podem e devem ser totalmente capturadas pelo %path::dependências hash durante a carga de inicialização do sistema de compilação do lib/path.pm de sua árvore de origem, que é como as vistas incorporadas contidas em nosso SunStarSys::Visualizar O pacote Perl deve funcionar. O walk_content_tree, arquivado, e seed_file_deps funções de utilitário importáveis de SunStarSys::Util são úteis na construção do %path::dependências hash, com suporte integrado para gerenciar um cache de dependência para acelerar builds incrementais em escala.
Aqui está a parte da nossa vida lib/path.pm:
our (%dependencies, @acl);
# entries computed below at build-time, or drawn from the .deps cache file
walk_content_tree {
$File::Find::prune = 1, return if m#^/(images|css|js)\b#;
return if -d "content/$_";
seed_file_deps, seed_file_acl if /\.(?:md|ya?ml|csv)\b[^\/]*$/;
my $path = $_;
utf8::is_utf8 $path or utf8::decode $path;
state $count = 0;
for my $lang (qw/en es de fr ru sv he zh-TW ar ko ja pt-BR/) {
delete $dependencies{"/sitemap.html.$lang"} if ++$count <= 12;
next if m!\.page/!;
if (/\.md\.$lang$/ or m!/index\.html\.$lang$!) {
push @{$dependencies{"/sitemap.html.$lang"}}, $path if !archived;
}
if (/^(.*)\.tex\.$lang$/ and -f "content$1.bib.lang") {
push @{$dependencies{$path}}, "$1.bib.$lang";
}
if ($path =~ s!/index\.html\.$lang$!!) {
$dependencies{"$path/index.html.$lang"} = [
grep {utf8::decode $_; s/^content//}
glob("'content$path'/*.md.$lang"),
glob("'content$path'/*/index.html.$lang")
];
}
}
}
and do {
while (my ($k, $v) = each %{$facts->{dependencies}}) {
$dependencies{$k} = [grep $k ne $_, grep s/^content// && !archived, map glob("'content'$_"), ref $v ? @$v : split /[;,]?\s+/, $v];
}
open my $fh, "<:raw", "lib/acl.yml" or die "Can't open acl.yml: $!";
unshift @acl, @{Load join "", <$fh>};
my %cache;
@acl = grep !$cache{$_->{path}}++, @acl;
for (glob("content/*/index.md.*")) {
next if /archives|categories/;
s!/index\.md\.[^/]+$!!;
push @acl, { path => $_, rules => {
'@bloggers' => 'rw',
'@svnadmin' => 'rw',
'*' => 'r',
}} unless $cache{$_}++;
}
};
Por favor, avalie esse código para obter ideias sobre como você deseja que o seu site funcione. Sim, há alguma complexidade razoável (envolvendo as expressões regulares do Perl e o UNIX C-shell do Perl) globo interfaces, de uma forma muito precisa) em torno de como %path::dependências é construído nesse arquivo, mas em vez de apenas ver isso como um trabalho de otimização, em vez disso, olhe para ele como fornecendo os ingredientes básicos necessários para interpretar os principais aspectos da topologia *link *de uma forma automatizada, gerada dinamicamente.
Onde inserir %path::dependências originar? Se não nascerem de uma invocação de walk_content_tree { seed_file_deps ... }, (que basicamente mergulha em seus cabeçalhos e conteúdo dos arquivos de origem de markdown), então eles são codificados em lib/facts.yml no momento da carga.
Gráficos de dependência cíclica são a norma
Nosso site atualmente consiste em 240 arquivos de origem em conteúdo/. Aqui está um 85 vértices x 465 bordas, representação gráfica direcionada bidimensional e rolável de um instantâneo recente das dependências de página do idioma inglês no nosso site (usando GraphViz’s ponto):
Muito complexo, mesmo para um pequeno site como este! Muitas interseções de borda ao tomar (evitável em dimensão ). De particular atenção é o conjunto central de densas dependências cíclicas nos arquivos não arquivados em nosso site. /mensagens/ diretório, em direção ao centro-direito inferior do gráfico, que é o que um bom gráfico de dependência do site de blog deve parecer. Essas dependências são extraídas em curvas vermelhas na imagem.
Observe também a interconexão interna, essencialmente isolada dos elementos em /categorias/*/* e /archives/2022/11/*. As únicas dependências externas envolvem conteúdo não arquivado no /ensaios/*. Isto é por design — os ensaios arquivados só devem mudar adiabaticamente, talvez apenas para ajustes aos seus Categoria cabeçalhos. Nenhuma dessas alterações afeta materialmente o conteúdo pré-existente, portanto, não o rastreamos no %path::dependências.
Claro, o nosso Wiki do Orion Enterprise Nunca teve problemas em lidar com dependências cíclicas.
Isso não é apenas sobre hiperlinks?
**Na verdade, a topologia link do seu site é um assunto totalmente separado do gráfico dependência da árvore de origem. Um mecanismo de pesquisa irá, naturalmente, descobrir a topologia link, mas não tem nenhuma visão do gráfico dependency.
Aqui está um 240+ vértices x bordas 3859, gráfico atual de observação de aves do gráfico inglês link topology para nosso site (usando GraphViz’s twopi):
Você pode identificar o bordas vermelhas conforme especificado no gráfico dependência? O gráfico link topology é qualitativamente e quantitativamente muito diferente do gráfico dependência descrito acima (dramaticamente menor e menos interconectado).
Como a tecnologia SSI pode ajudar
Tradicional Inclui (SSI)
- Ótimo para podar o gráfico de dependência do seu site até o tamanho gerenciável sem sacrificar a latência de entrega da página
- ótimo para diminuir a rotatividade de texto padronizado em grandes mensagens de commit para melhor revisão por pares e supervisão de seus conjuntos de alterações criados
- mal para recontextualizar páginas inteiras em um local diferente na hierarquia da raiz do documento
APIs de Modelo
tag ssi
Syntax:
{% ssi `/content_rooted/path/to/source_file` %}
- caminhos com raiz em
conteúdodiretório de origem - ignora a parte do cabeçalho do arquivo de origem a ser
ssiincluído - reescreve URLs relativos para URLs absolutos no conteúdo incluído do caminho de destino
filtro ssi
Syntax:
{{ conteúdo|ssi }}
- avaliações recursivas
ssitags no valor a ser filtrado - útil para evitar o uso de um grande valor (3+) de
quick_depsem um@path::padrõeshashref do argumento de entrada, que pode afetar o desempenho
Por que não SymLinks?
- abstração do sistema de arquivos barebones que é difícil de suportar com segurança em um
<VirtualHost>contexto - mesmas desvantagens com tradicional
ssiem páginas web completas - nosso Wiki do Orion Enterprise O sistema não os suporta
Criar Ferramentas para Permalinks
Curadoria de Documento
O sistema de compilação da Orion tem suporte integrado para o que chamamos de Document Curation, que é o processo de recontextualização e reorganização do seu conteúdo com base na forma como você define o Categorias e Status cabeçalhos em seus arquivos de origem de Markdown. Esses recursos estão desabilitados por padrão, mas podem ser ativados definindo um category_root (para suporte de categoria) ou um archive_root (para suporte de Arquivamento) no argumento hashref associado ao desejado @path::padrões entrada.
Categorias
- novo conteúdo é construído usando Modelo
ssitags que apontam para o local do permalink, - as categorias são estritamente aditivas (ou seja, remover uma categoria dos cabeçalhos de uma página de origem não a removerá dessa categoria no site ao vivo),
- gerado sob demanda,
- excluir todas as categorias em um único commit é uma ótima maneira de sincronizá-las com as especificações exatas em todos os cabeçalhos das páginas de origem, sem destruir o conteúdo de categoria preservado no site ao vivo.
Páginas Arquivadas
Em nosso site, arquivamos agressivamente ensaios obsoletos para manter os tempos de construção de novos ensaios baixos, sem destruir os links permanentes para documentos arquivados. O gráfico de dependência relativo ao /arquivos/ diretório (para o nosso site) é razoavelmente autossuficiente conforme as seguintes regras:
- conteúdo construído usando Modelo
ssitags que apontam para o local do permalink, ao remover oCategoriascabeçalho da página de origem construída - conteúdo em
/(ensaios|clientes)/são sempre permalinks, mesmo após o arquivamento - o arquivamento remove efetivamente a localização do permalink do gráfico dependency, sem remover o permalink do site
Lede
Comentários HTML incorporados nos limites do formulário de prosa Markdown do conteúdo lede. Usamos {# lede #} para este fim.
O processamento de ledes é feito com o lede Filtro de modelo. É útil combinar isso com o ssi para indexar um arquivo de Categoria com mais de uma página de categoria dentro dele.
Conclusões
Existem estruturas de dados interessantes e relações a serem descobertas ao lidar com o gráfico de dependência de um site *a partir de uma perspectiva de desempenho de construção, que é uma área de interesse muito mais nova do que a literatura de pesquisa que investiga as estruturas de dados e emissões associadas em torno da topologia de link *.1,2.
Construções incrementais convencionais para projetos de desenvolvimento de software puro ainda são um tópico importante. A pesquisa abordada em 3,4 foi publicado em outubro de 2022, cerca de um mês antes de este ensaio ser concluído. O pluto5 o sistema de build tem recursos bastante semelhantes aos nossos (a própria build pode gerar novamente e recriar dependências dinamicamente).
A boa notícia é que temos você coberto como nosso cliente. Vamos mantê-lo informado sobre as melhores práticas e o estado da arte neste espaço, para que você se beneficie de nossas lições aprendidas na última década e no futuro.
Notas de rodapé
Identificação de clusters no gráfico da Web com base na topologia do link Sétimo Simpósio Internacional de Engenharia de Banco de Dados e Aplicações, 2003. Procedimentos.
Inferindo Comunidades Web da Topologia de Links Anais da nona conferência ACM sobre hipertexto e hipermídia: links, objetos, tempo e espaço — estrutura em sistemas de hipermídia: links, objetos, tempo e espaço — estrutura em sistemas de hipermídia. 1998.
Sobre os benefícios e limites das configurações incrementais de software de construção: um estudo exploratório ICSE ‘22: Proceedings of the 44th International Conference on Software Engineering, maio de 2022
Para criação incremental de configurações de software ICSE-NIER ‘22: Proceedings of the ACM/IEEE 44th International Conference on Software Engineering: New Ideas and Emerging Results, maio de 2022
Um sistema de criação incremental sólido e ideal com dependências dinâmicas OOPSLA 2015: Anais da Conferência Internacional ACM SIGPLAN de 2015 sobre Programação Orientada a Objetos, Sistemas, Linguagens e Aplicações Outubro de 2015
