Build system: a failed first build forces full rebuilds, and clean breaks a running watch

Đang mở
#9,241 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@cknitt đang làm issue này rồi.

Từ ngày 6/11/2026.

  • #9247 của @cknitt — đang mở

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
52/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Lĩnh vực
build-system

Hướng nghiên cứu

Start with compiler_info.ml:133-136 and build.ml:452-457 to trace when compiler metadata is checked and written after a failed build. Then inspect clean.ml:83 and how lib/watch.lock is used by the watcher; build.ml:556-558 shows where the raw error is printed. Done means failed builds no longer trigger repeated full cleans and running watches recover or are protected from concurrent clean operations.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Two ways the build system loses or misreads its state in lib/. Both reproduce with rescript 13.0.0-alpha.8 (found while reviewing #9238).

1. After a failed first build, every build cleans everything
# src/A.res: let x: int = "s"     src/B.res: let y = 1
rescript build   # Cleaned 0/0 … exit 1
rescript build   # Cleaned previous build due to compiler update / Cleaned 0/1 / Compiled 2 modules, exit 1
rescript build   # same again

Every build after the first failed one wipes lib/bs and lib/ocaml and recompiles all modules (B as well), with a misleading "compiler update" message, until a build succeeds.

compiler_info.ml:133-136 (needs_clean) treats an existing lib/ocaml/.compiler.log without compiler-info.json as a stale build, but compiler-info.json is only written after a successful build (build.ml:452-457).

2. rescript clean while rescript watch runs breaks the watcher
# src/A.res: let x = 1     src/B.res: let y = A.x
rescript watch &
rescript clean     # Cleaning x, exit 0
# edit src/A.res

Every later rebuild fails with Sys_error("<root>/lib/ocaml/A.ast: No such file or directory"), and the watcher never recovers.

clean.ml:83 only takes the build lock, which the watcher holds only while it builds. clean should refuse while lib/watch.lock is held (or the watcher should rebuild from scratch when its outputs disappear). The raw Sys_error is printed by build.ml:556-558.

Ngôn ngữ chính
OCaml
Star
7.5k
Fork
485
Merge trung bình
16 giờ 51 phút
Pull request đã merge (30 ngày)
268

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của rescript-lang/rescript

Tất cả issue của rescript-lang/rescript

Issue tương tự

Thêm issue về Build System

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.