Kernel
Kernel được thiết kế nhỏ một cách có chủ ý và không có bất kỳ phụ thuộc bên thứ ba nào - nó thuần thư viện chuẩn. Mọi thứ trong đó đều rơi vào một trong số ít module sau.
| Module | Trách nhiệm |
|---|---|
hooks.py | SyncHook, SyncBailHook, SyncWaterfallHook. |
builder.py | Builder (bộ điều phối vòng đời) và BuilderHooks. |
build.py | Build, trạng thái của một lần chạy. |
models.py | Source và Output, các túi dữ liệu trung tính. |
plugin.py | Protocol Plugin. |
config.py | Config và việc nạp pyssg.config.py. |
cli.py | Điểm vào pyssg build. |
Không phụ thuộc theo thiết kế
Quy tắc rất đơn giản: kernel chỉ dùng thư viện chuẩn; plugin được dùng bất cứ
thứ gì chúng cần. Điều này hóa giải mâu thuẫn giữa "giữ phụ thuộc tối thiểu" và
"chúng ta cần một bộ phân tích Markdown thực thụ". Kernel luôn sạch sẽ, trong khi
một plugin như Markdown thoải mái phụ thuộc vào python-markdown, được import
lười (lazy) nên chi phí chỉ phải trả khi plugin thực sự được dùng.
Protocol plugin
Một plugin là bất kỳ đối tượng nào có phương thức apply:
class Plugin(Protocol):
def apply(self, builder: Builder) -> None: ...
Bên trong apply, plugin tap vào những hook nó quan tâm. Đó là toàn bộ hợp đồng
giữa kernel và các phần mở rộng của nó.
Builder
Builder được tạo từ một Config. Khi khởi tạo, nó áp dụng mọi plugin (gọi
apply), rồi phát hook initialize. Gọi run() sẽ thực thi trọn một
vòng đời và trả về Build thu được.
Vì builder là một đối tượng sống lâu, nó là nơi tự nhiên cho một chế độ watch trong tương lai - rebuild khi file thay đổi - mà không phải sửa bất kỳ plugin nào.