Smart Content Dependency Management™의 모든 것
요약
*스마트 콘텐츠 종속성 관리™*는 incremental builds에 대한 지원 및 촉진 제공과 관련된 아이디어의 원에 관한 것이며, Content Normalization Principle에 충실합니다. — 해당 permalinks 소스 트리 및 결과 빌드 아티팩트에서 콘텐츠가 선별되는 방식에 관계없이 신뢰성 있는 단일 소스여야 합니다.
이 문서는 https://sunstarsys.com/ 모범 사례 데모 및 관련 그래프 토폴로지 분석에 대한 사례 연구로서의 웹 사이트
주의 사항
이것은 웹 페이지에서 콘텐츠를 조정해야 할 때마다 전체 사이트 빌드를 수행하는 데 드는 비용을 측정해야 할 때만 중요합니다. 웹사이트에 1K개 미만의 소스 파일이 있는 경우 완화하고 향후 요구 사항을 염두에 두고 다음을 읽으십시오. 오라클 플랫폼을 사용하기로 결정했는데, 이 플랫폼은 귀사가 아닌 귀사와 함께 확장할 수 있도록 설계되었습니다. 대부분의 페이지에서 이 자료는 1K페이지가 넘는 사이트의 희소 콘텐츠 종속성 그래프에 관한 것입니다.
예를 들어, 아파치 https://www.OpenOffice.Org 웹 사이트는 이 빌드 시스템의 원래 아파치 버전을 사용하여 40K+ 파일을 빌드할 수 있었고, 증분 빌드에 대한 완전한 통합 지원 — 구성된 종속성 없음 — 전통적인 SSI 기술을 단독으로 사용합니다.
기본적으로 빌드 시스템은 파일 내 종속성을 고려하지 않고 변경한 파일만 빌드합니다. 단, %path::종속성 — 그 아래에 더 있습니다.) 변경한 파일이 템플리트/ 또는 라이브러리/ 전체 사이트 빌드가 대신 트리거됩니다.
웹 사이트의 종속성 그래프를 함께 길쌈
수학적으로 토폴로지 는 공간의 open 부분 집합의 전체 사양입니다. 의 목적은 points 사이의 근접 관계를 나타내는 것입니다. 의 공간 . 시기 그래프입니다. topology 대상 그래프의 정점을 함께 연결하는 모서리를 지정하는 양(여기서 정점은 , 연결 모서리는 해당 점의 이웃을 토폴로지에 대한 기본 열린 세트로 결정합니다. 지시된 그래프 토폴로지는 기본적으로 동일하지만 토폴로지 임베딩에 대한 참조를 포함합니다. 더 큰 위상 공간으로 에서는 임베딩의 모서리 연결이 방향, 비교차(요르단) 곡선으로 표시됩니다.
후자의 개념은 종속성 그래프의 토폴로지에 대해 논의할 때 우리가 활용할 것입니다. 공간과 연관됨 사이트 아래의 소스 파일 콘텐츠/ 하위 디렉토리(여기 다음과 같음 측정 단위 토폴로지 사용 의 모서리 및 은(는) 교차하지 않으며 파일을 연결하는 Jordan 곡선으로 지정됩니다. 해당 파일 세트에 종속: ).
필요 웹 사이트의 *의존성 그래프 *에 대한 명확한 이해를 통해 대규모 구축 기술의 성능을 극대화할 수 있습니다.. 우리는 당신이 제공하는 정보를 가지고 %path::종속성 웹 사이트의 빌드 로드 중 라이브러리/path.pm file, construct a reverse map of dependent files, and use that reverse map to determine the full corpus of files to build for any given 파일, 종속 파일의 역방향 맵을 생성하고 반전 맵을 사용하여 지정된 파일에 대해 빌드할 파일의 전체 코퍼스를 결정합니다. svn 커밋 당신은 우리의 시스템을 만듭니다.
소스 파일 간의 종속성 관계는 %path::종속성 빌드 시스템 시작 로드 중 해시 라이브러리/path.pm 소스 트리에서 내장된 뷰가 SunStarSys::보기 Perl 패키지는 작동하기 위한 것입니다. 해당 walk_content_tree, 아카이브됨및 seed_file_deps 유틸리티 함수 임포트 출처 SunStarSys::까지 은(는) %path::종속성 대규모 증분 빌드를 가속화하기 위해 종속성 캐시 관리를 위한 기본 지원이 포함된 해시.
Here’s that part부품 of our live라이브 라이브러리/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{$_}++;
}
};
*당신의 웹 사이트 *가 어떻게 작동하길 원하는지에 대한 아이디어를 위해 그 코드를 멀리하십시오. 예, 몇 가지 합리적인 복잡성이 있습니다 (Perl의 정규 표현식과 Perl의 UNIX C 쉘 모두 포함). 글로벌 인터페이스, 매우 정확한 방식으로) %path::종속성 이 파일은 해당 파일에 구성되어 있지만 최적화 작업으로 보는 대신 동적으로 생성되는 자동화된 방식으로 link 토폴로지의 주요 측면을 해석하는 데 필요한 기본 요소를 제공하는 것으로 간주합니다.
입력 위치 %path::종속성 생성 여부 만일 그들이 부르심으로부터 태어나지 않았다면 walk_content_tree { seed_file_deps ... }(기본적으로 매가인하 소스 파일의 헤더와 컨텐트에 다이빙), 그들은 단지 하드 코딩됩니다 라이브러리/facts.yml 하중 시간에.
순환 종속성 그래프가 표준임
현재 저희 사이트는 240개의 소스 파일 위치 콘텐츠/. 여기 85개의 정점 x 465개의 가장자리**우리 사이트에 대한 영어 페이지 종속성의 최근 스냅샷을 스크롤할 수 있는 2차원 지정 그래프 표현(GraphViz 사용 점):
아주 복잡한, 심지어이 같은 작은 웹 사이트! 여러 개의 모서리 교차점 사용 시 차원에서 피할 수 있음 ). 특히 우리 사이트의 아카이브되지 않은 파일에서 밀집, 순환 종속성의 핵심 집합입니다. /매일/ 디렉토리, 그래프의 오른쪽 하단 중심을 향해, 이는 좋은 블로깅 사이트의 종속성 그래프의 모양입니다. 이러한 종속성은 빨간색 곡선 이미지에.
또한 내부적으로 격리된 요소의 상호 연결성을 /카테고리/*/* 및 /archives/2022/11/*. 유일한 외부 종속성에는 아카이브되지 않은 컨텐트가 /essays/*. 이것은 디자인에 의해 — 보관된 에세이는 adiabatically만 변경해야 하며, 이는 해당 에세이에 대한 조정에만 해당됩니다. 범주 헤더 이러한 변경 사항은 기존 컨텐츠에 실질적으로 영향을 미치지 않으므로 %path::종속성.
물론 우리의 오리온 엔터프라이즈 위키 순환 종속성을 처리하는 데 문제가 없었습니다.
이것은 단지 하이퍼링크에 관한 것이 아닙니까?
아니요! 사실, 웹 사이트의 링크 토폴로지는 소스 트리의 종속성 그래프와 완전히 별개의 문제입니다. 검색 엔진은 자연스럽게 link 토폴로지를 추출하지만 dependency 그래프에 대한 인사이트는 없습니다.
여기 a 240+ 정점 x 3859 모서리, 우리 사이트에 대한 영어 링크 토폴로지 그래프의 현재 조류 눈 그래프(GraphViz 사용 쌍둥이):
다음을 확인할 수 있습니다. 빨간색 모서리 종속성 그래프에 지정된 대로 링크 토폴로지 그래프는 위에 표시된 (대략적으로 더 작고 덜 상호 연결된) 종속성 그래프와 정량적으로 **매우 다릅니다.
SSI 기술이 도움이 되는 방법
기존 서버측 포함 (SSI)
- 좋은 웹 사이트의 종속성 그래프를 페이지 전달 대기 시간 저하 없이 관리 가능한 크기로 제거
- 큰 커밋 메시지의 보일러 플레이트 이탈 감소로 인해 더 나은 피어 검토 및 빌드된 Changeset 감독 수행
- lousy - 전체 웹 페이지를 문서 루트의 계층에 있는 다른 위치로 다시 컨텍스트화하는 데 사용됩니다.
템플리트 API
ssi 태그
Syntax:
{% ssi `/content_rooted/path/to/source_file` %}
- 루트 지정된 경로
콘텐츠소스 디렉토리 - 소스 파일의 헤더 부분을 건너뜁니다.
ssi포함 - 대상 경로의 포함된 콘텐츠에서 절대 URL에 상대 URL을 재작성합니다.
ssi 필터
Syntax:
{{ 콘텐츠|ssi }}
- 반복적으로 평가
ssi필터링할 값의 태그 - 큰 값(3+)을 사용하지 않는 데 유용합니다.
quick_deps의@path::패턴entry의 인수 hashref, 성능에 영향을 줄 수 있음
SymLinks가 아닌 이유는 무엇입니까?
- 베어본 파일 시스템 추상화로,
<VirtualHost>컨텍스트 - 전통적인 것과 동일한 downsides
ssi전체 웹페이지
우리의 오리온 엔터프라이즈 위키 시스템에서 이를 지원하지 않습니다.
Permalinks용 빌드 도구
문서 큐레이션
Orion의 빌드 시스템은 Document Curation이라고 부르는 것에 대한 통합 지원을 제공합니다. 이 기능은 사용자가 설정한 방식에 따라 콘텐츠를 다시 컨텍스트화하고 재구성하는 프로세스입니다. 범주 및 상태 마크다운 소스 파일의 헤더입니다. 이러한 기능은 기본적으로 비활성화되지만 category_root (범주 지원의 경우) 또는 archive_root (아카이빙 지원의 경우) 원하는 해시 참조 인수에 @path::패턴 입력합니다.
범주
- 템플리트를 사용하여 새 콘텐츠 생성
ssipermalink 위치로 다시 가리키는 태그, - 범주는 엄격하게 첨가됩니다(즉, 소스 페이지의 헤더에서 범주를 제거해도 라이브 사이트의 해당 범주에서 범주가 제거되지 않음).
- 요청에 따라 생성됨,
- 단일 커밋에서 모든 범주를 삭제하는 것은 라이브 사이트에서 보존된 범주 콘텐츠를 삭제하지 않고 모든 소스 페이지 헤더의 정확한 사양과 동기화하는 좋은 방법입니다.
아카이브된 페이지
우리의 사이트에서, 우리는 적극적으로 아카이브 된 문서에 대한 permalinks를 파괴하지 않는 동안, 낮은 새로운 에세이에 대한 구축 시간을 유지하기 위해 오래된 에세이를 아카이브. 종속성 그래프는 /아카이브/ 디렉토리(사이트용)는 다음 규칙에 따라 자체적으로 포함되어 있습니다.
- 템플리트를 사용하여 생성된 콘텐츠
ssi태그는 permalink 위치를 다시 가리키며범주생성된 소스 페이지의 헤더 - 내용
/(essays|클라이언트)/아카이브 후에도 항상 permalink로 지정됩니다. - 아카이빙은 웹 사이트에서 permalink 자체를 제거하지 않고 dependency 그래프에서 permalink 위치를 효과적으로 제거합니다.
Lede
lede 콘텐츠의 Markdown prose 폼 경계에 포함된 HTML 주석입니다. 사용 {lede 번호 수} 이 목적을 위해
처리 LED는 lede 템플리트 필터입니다. 이 명령문을 ssi 범주 페이지가 두 개 이상 포함된 범주 파일을 인덱스화하기 위한 필터입니다.
결론
빌드 성능 관점에서 웹 사이트의 *의존성 그래프 *를 처리 할 때 아직 발견 될 흥미로운 데이터 구조와 관계가 있습니다.이 그래프는 *링크 토폴로지를 둘러싼 연구 문헌 및 관련 문제보다 훨씬 새로운 관심 영역입니다 *1,2.
순수 소프트웨어 개발 프로젝트에 대한 기존의 증분 빌드는 여전히 뜨거운 주제입니다. 다음에서 다루는 연구 3,4 2022년 10월에 이 에세이를 완료할 것으로 예상되기 약 1개월 전에 발행되었습니다. 명왕성5 빌드 시스템에는 당사와 매우 유사한 기능이 있습니다(빌드 자체는 종속성을 동적으로 재생성하고 재구축할 수 있음).
좋은 소식은 당신이 우리의 고객으로 덮여 있다는 것입니다. 이 공간에서 모범 사례와 예술의 상태에 대한 애착을 유지하여 지난 10년 동안 배운 교훈과 내일의 교훈을 활용할 수 있습니다.
각주
링크 토폴로지를 기반으로 웹 그래프에서 클러스터 식별 일곱 번째 국제 데이터베이스 엔지니어링 및 응용 프로그램 심포지엄, 2003. 진행.
링크 토폴로지에서 웹 커뮤니티 추론 하이퍼텍스트 및 하이퍼미디어에 관한 아홉 번째 ACM 컨퍼런스의 절차: 링크, 객체, 시간 및 공간 — 하이퍼미디어 시스템의 구조: 링크, 객체, 시간 및 공간 — 하이퍼 미디어 시스템의 구조. 1998.
증분 빌드 소프트웨어 구성의 이점과 한계: 탐색 연구 ICSE ‘22: Proceedings of the 44th International Conference on Software Engineering(2022년 5월, 소프트웨어 공학에 관한 제44회 국제회의 절차)
소프트웨어 구성의 증분 구축 ICSE-NIER ‘22: Proceedings of the ACM/IEEE 44th International Conference on Software Engineering: New Ideas and Emerging Results(ACM/IEEE 제44회 소프트웨어 공학 국제회의 절차: 새로운 아이디어와 새로운 결과), 2022년 5월
동적 종속성이 있는 사운드 및 최적 증분 빌드 시스템 OOPSLA 2015: Proceedings of the 2015 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, and Applications 2015년 10월
