voidzero-dev / voidzero-dev/vite-task

Package.json script tasks don't expose npm lifecycle env; cache-enabled tasks strip host-stamped values

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

まだ誰も着手していません。

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

説明

Summary

When vite-task spawns a package.json script, the child gets none of the npm lifecycle environment variables (npm_execpath, npm_config_user_agent, npm_lifecycle_event, npm_node_execpath, …) that npm, pnpm, and Yarn all set when they run scripts. Tools that detect their invoking package manager from that env — npm-run-all2/run-p being the common one — silently fall back to npm, which then fails devEngines.packageManager enforcement in pnpm projects.

Downstream report: voidzero-dev/vite-plus#2317 (vpr checkrun-p → npm → EBADDEVENGINES). Reproduced there with a minimal project: pnpm run check sets npm_execpath=<pnpm>/bin/pnpm.mjs, npm_config_user_agent=pnpm/11.20.0 …, npm_lifecycle_event=probe for the child; the same script through the task runner gets none of them.

Why a vite-plus-side fix can't fully cover it

voidzero-dev/vite-plus#2385 stamps npm_execpath / npm_config_user_agent / npm_node_execpath / INIT_CWD into the process env before Session::init snapshots it. That works for plain scripts (which default to cache: scripts: false), but two pieces need the planner:

  1. Cache-enabled tasks strip the stamped vars again. plan_spawn_execution runs EnvFingerprints::resolve(&mut spawn_envs, &cache_config.env_config) before spawning, and DEFAULT_UNTRACKED_ENV contains no lowercase npm_* name (matching is case-sensitive on Unix). So for cache: { scripts: true } or config-defined tasks (cached by default), the session-level stamp is filtered out and the npm fallback returns — only in the cached case, which no fixture currently exercises. The VP_RUN marker had this exact problem and is re-inserted after the filter, with a comment explaining why.
  2. npm_lifecycle_event / npm_lifecycle_script are per-task values (script name / script body). Only the planner knows them; a session-level stamp can't provide them. pnpm sets both for every script it runs.

Suggested direction

  • Re-insert the lifecycle names post-filter next to the existing MARKER_ENV_NAME insert in vt_plan (or add them to DEFAULT_UNTRACKED_ENV), so host-provided lifecycle env survives cache-enabled tasks.
  • Optionally set npm_lifecycle_event (and npm_lifecycle_script) from the task itself when spawning package.json scripts, which vite-plus cannot do from outside.

Happy to send a PR for either or both if the direction sounds right — the vp_run_env e2e fixture looks like the natural place for coverage (its cached case already demonstrates the marker surviving the env filter).

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

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

はじめの一歩

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

調査の方向性

vt_plan の plan_spawn_execution から始め、EnvFingerprints::resolve、DEFAULT_UNTRACKED_ENV、既存の MARKER_ENV_NAME の挿入を調べます。次に、キャッシュされるケースを含め、vp_run_env の end-to-end fixture を最初から最後まで読みます。完了条件は、package.json のタスクが、キャッシュが有効なタスクを含め、関連する npm lifecycle environment を保持し、報告された動作をカバーしていることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
nodejs, rust
領域
build-system, tooling
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
活発
明瞭さ
おおむね明確
初心者へのやさしさ
65/100

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

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