watch
Xem tệp: watch.Watcher từ Zig và giao diện native và watch(name) cho các trang, ở phần gốc là tên ứng dụng, không bao giờ xem trên đường dẫn mà trang chọn.
Gói này là plugins/watch (mô-đun watch); nó phụ thuộc vào mainthread. Xem Plugin để thêm plugin vào ứng dụng. (Lõi của myzig có trình theo dõi nhỏ hơn cho tệp của một tài liệu, myzig.file_watch; xem Hệ thống.)
Sử dụng từ Zig
const watch = @import("watch");
fn skipNodeModules(_: ?*anyopaque, path: []const u8, is_dir: bool) bool {
return is_dir and std.mem.eql(u8, std.fs.path.basename(path), "node_modules");
}
const w = try watch.Watcher.init(gpa, io, project_dir, .{ .recursive = true, .ignore = skipNodeModules });
defer w.deinit();
while (true) { // on a thread or an Io task of its own
const events = w.next(arena) catch break; // error.EndOfStream: closed, or what is watched went away
for (events) |e| std.log.info("{t} {s}", .{ e.op, e.path }); // create, write, remove, rename (old_path)
}pathcủa một sự kiện liên quan đến nội dung được xem, có dấu gạch chéo;.chính là đường dẫn được theo dõi. Có gì khi đồng hồ bắt đầu không được báo cáo.- Thông báo của hệ thống chỉ là gợi ý: sau đó đồng hồ sẽ đợi yên tĩnh, nhìn lại và báo cáo những gì khác với những gì nó nhìn thấy. Một tập tin được viết nhiều lần là một
write; một cái được tạo ra và loại bỏ ở giữa thì không là gì cả; việc xóa và tạo cùng một id tệp làrename. Hãy coi các sự kiện như gợi ý để đọc lại các tập tin. - Nó không nhìn lại cho đến khi
nextđược gọi: không có gì chồng chất trong khi ứng dụng đang bận và không có gì bị mất. - Một tập tin được xem qua thư mục của nó: được viết hoặc thay thế (khi người chỉnh sửa lưu) là
writecủa., đã xóaremove. Khi nội dung đang xem (hoặc thư mục của tệp) bị xóa hoặc thay thế, lô cuối cùng córemovelà., sau đónexttrả vềerror.EndOfStream. close()(từ bất kỳ chuỗi nào) kết thúc quá trình chờ đợinext;nextcũng có thể hủy được thông quaIo.
watch.Options:
| lĩnh vực | mặc định | |
|---|---|---|
recursive | false | xem các thư mục bên trong quá |
ignore, ignore_ctx | null | fn (ctx, path, is_dir) bool: loại bỏ các đường dẫn (thư mục bị bỏ qua sẽ không bao giờ được mở) |
max_entries | 8192 (65536 trên macOS) | hầu hết các tập tin và thư mục mà một chiếc đồng hồ bao gồm |
debounce_ms | 0 (50 mili giây) | yên tĩnh chờ đợi; báo cáo tiêu cực cùng một lúc |
max_delay_ms | 500 | những thay đổi dài nhất hãy chờ đợi trong khi nhiều thay đổi khác tiếp tục đến |
watch.scan và watch.diff là ảnh chụp nhanh và sự so sánh của chúng mà trình theo dõi được xây dựng trên đó.
| nền tảng | gợi ý |
|---|---|
| Windows | một cái chồng chéo ReadDirectoryChangesW trên thư mục (cây của nó khi đệ quy) |
| Linux | inotify, theo dõi mỗi thư mục được xem |
| macOS | FSEvents, một luồng cho cây, các sự kiện ở cấp độ tệp |
Sử dụng từ trang web
var service: watch.Service = try .init(gpa, app.io, .{ .roots = &.{
.{ .name = "project", .path = project_dir, .recursive = true },
.{ .name = "settings", .path = settings_file },
} });
defer service.deinit();
try app.bind(&service);
try app.registerEvent(watch.BatchEvent);
// ... .assets = &.{ index_html, watch.asset }import { watch, WatchError } from "/plugins/watch.js";
const watcher = await watch("project", { recursive: true, path: "src" }); // resolves once watched
for await (const events of watcher) {
for (const e of events) console.log(e.op, e.path, e.oldPath, e.isDir);
}
// watcher.close(), break, or { signal }; watcher.closed settles once Zig stopped itwatch.Rootcóname(chữ thường, chữ số và dấu gạch ngang, bắt đầu bằng một chữ cái),pathtuyệt đối phải tồn tại (initnếu không thì không thành công),recursivevàignorecủa chính nó.pathcủa một trang nằm ở thư mục gốc, có dấu gạch chéo; nó không thể rời khỏi nó cũng như không đi qua một liên kết tượng trưng. Đồng hồ đệ quy và đồng hồ của một thư mục trong thư mục gốc cần có gốc vớirecursive.- Lỗi là
WatchErrorvớicode:denied,not-found,limit(quá nhiều đồng hồ hoặc quá nhiều mục),path-encoding,io. - Zig lấy đợt tiếp theo sau khi trang lấy đợt cuối cùng.
- Đồng hồ của cửa sổ sẽ dừng sau khi cửa sổ đóng (trong cuộc gọi hoặc đợt tiếp theo của dịch vụ).
watch.ServiceOptions:
| lĩnh vực | mặc định | |
|---|---|---|
roots | không có | những trang nào có thể xem |
allow, allow_ctx | null | fn (ctx, window, name, path, recursive) bool, được hỏi trước mỗi lần xem |
max_watches_per_page | 8 | |
max_watches | 128 | trong tất cả các cửa sổ |
Chưa hỗ trợ
- mygo's
Resolve(root được cấp trong khi ứng dụng chạy): thêm root vàorootstrướcinit. - Windows: việc đổi tên thư mục đã xem chỉ được nhìn thấy ở lần thay đổi tiếp theo trong đó (mygo cũng theo dõi thư mục mẹ của nó).
- Gợi ý macOS và Linux biên dịch trên mọi nền tảng nhưng chạy ít hơn Windows'.
Ví dụ và kiểm thử
example/ xem hộp cát trong thư mục tạm thời mà trang này thay đổi thông qua Zig; zig build run hiển thị nó.
cd plugins/watch
zig build test # snapshots, diffs and watchers on temporary directories, and the page, hidden
zig build test -Dpage=false
zig build check -Dtarget=x86_64-linux-gnuCác bài kiểm tra không bao giờ ngủ: chúng thay đổi tệp, sau đó thực hiện theo đợt cho đến khi sự kiện mà chúng mong đợi xảy ra (với việc gỡ lỗi).
