voidzero-dev / voidzero-dev/vite-task

Negative `input` pattern is ignored for files discovered via `readdir`

オープン
#504 コメント 2 件 リアクション 0 件 担当者 1 名 GitHub で見る

@wan9chi がすでに取り組んでいます。

2026年7月3日 から。

主要言語
Rust
スター
466
フォーク
42
平均マージ
1日 15時間
マージ済み PR(30日)
19

説明

Summary

A negative input pattern ("!path") correctly excludes a file a task reads by direct path, but does not exclude a file the task discovers through a directory listing (readdir). When such a file is a build artifact that is absent on a fresh checkout, its removal invalidates the cache with Removed, so the cache never hits, even though a negative pattern for that exact path is present.

Reproduction

https://github.com/why-reproductions-are-required/vite-task-negative-input-pattern-readdir

pnpm install
./repro.sh

The repro defines two tasks that differ only in how they discover an excluded, generated artifact:

// BUG: artifact found via readdir("assets")
"readdir-case": {
  command: "node -e \"fs.readdirSync('assets'); fs.writeFileSync('assets/generated.txt', ...)\"",
  input: [{ auto: true }, "!assets/generated.txt"],
},
// CONTROL: artifact read by direct path
"direct-path-case": {
  command: "node -e \"try { fs.readFileSync('direct.txt') } catch {}; fs.writeFileSync('direct.txt', ...)\"",
  input: [{ auto: true }, "!direct.txt"],
},

Expected vs actual

Each task is run 3 times; run 3 removes the excluded artifact before running. Removing an excluded file should keep the cache valid.

task discovery run 3 result
direct-path-case readFileSync HIT (correct)
readdir-case readdirSync MISS: InputChanged { Removed, "assets/generated.txt" }

Only the discovery method differs.

Impact

Real builds routinely list a directory that also contains generated files. In a Vite + void app the build lists directories holding .void/queues.d.ts, .void/routes.d.ts, public/feed.xml, public/sitemap.xml, public/posts/, etc. On a fresh CI checkout those files do not exist yet, so the cache misses on every run even with a negative pattern for each of them. The only workaround I found is to abandon { auto: true } and enumerate every input explicitly.

Possibly related

crates/vite_task/src/session/execute/fingerprint.rs notes that negative-glob filtering for the post-run fspy fingerprint is "done upstream" and that paths already in globbed_inputs are skipped; PathRead { read_dir_entries: bool } distinguishes directory-listing reads. The negative filter appears not to reach entries surfaced by a directory listing.

Environment

  • vite-plus 0.2.2 (bundles Vite Task)
  • Reproduced on macOS (darwin 25.x) and GitHub Actions ubuntu-latest

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。