A dev run stopped before its backend loads leaves .web/nocompile, so the next run or export skips the compile

未关闭 适合新手
#7,825 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
75/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
python

调研方向

从 reflex/utils/prerequisites.py 中的 get_compiled_app 开始,然后阅读 App._should_compile 如何处理 .web/nocompile,以及后端 worker 如何使用它。在 tests/units/utils/test_prerequisites.py 中添加一个回归测试,创建该标记并确认 get_compiled_app 会执行编译;完成标准是该测试在修复前失败、修复后通过。

由索引模型根据 Issue 内容生成。

描述

Summary

A dev reflex run creates .web/nocompile so that its backend worker does not compile the app a second time. Only that worker deletes the marker, when it first loads the app. If the run stops before the worker loads the app, the marker stays. The next CLI compile then consumes the marker and skips the compile:

  • reflex run serves the old frontend until a file save triggers a hot reload.
  • reflex export skips the compile, builds the old pages, and exits 0. A deploy from that machine ships the old frontend without a warning.

This is the same family as #7089. The fix in #7125 covered backend-only runs only.

Steps to reproduce

Use any app. Use explicit ports.

  1. Run reflex run once to completion, then stop it.
  2. Run reflex run again. Press Ctrl+C right after App running at: is printed. On a small app the window is about 0.8 s. It is longer on a larger app.
  3. Check that .web/nocompile exists.
  4. Change visible text in a page, for example rx.heading("V1") to rx.heading("V2").
  5. Do one of these:
    • Run reflex run. No Compiling: progress bar is shown. The browser shows V1. It stays V1 until you save a file.
    • Run reflex export --frontend-only --no-zip. The command exits 0, but .web/build/client contains V1, not V2.

Expected

A CLI command that compiles (reflex run, reflex export, reflex compile) always compiles. A marker left by an earlier run does not skip the compile.

Cause

  • run_backend creates the marker when a frontend is present.
  • App._should_compile deletes the marker and returns False. The CLI compile and the backend worker compile both call it, so a stale marker skips whichever compile runs first.

Suggested fix

The CLI paths reach the compile only through prerequisites.get_compiled_app (see the comment in App._compile). The backend worker uses App.__call__. So get_compiled_app can delete a stale marker before it compiles:

     app, app_module = get_and_validate_app(reload=reload)
+    # The marker only lets the backend that a dev run starts skip its compile.
+    # A run stopped before that backend loaded leaves it behind.
+    (get_web_dir() / constants.NOCOMPILE_FILE).unlink(missing_ok=True)
     app._compile(

I tested this change with the steps above:

  • reflex run after the early Ctrl+C compiles and serves the new text.
  • reflex export after the early Ctrl+C builds the new text.
  • A normal dev run still compiles once. The backend worker still consumes the marker and skips its own compile.

The fix needs a regression test, for example in tests/units/utils/test_prerequisites.py: create the marker, call get_compiled_app, and assert that a real compile ran.

主要语言
Python
星标
29k
派生
1.8k
平均合并
2 天 22 小时
30 天内合并 PR
143

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

reflex-dev/reflex 的其他 Issue

查看 reflex-dev/reflex 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。