A dev run stopped before its backend loads leaves .web/nocompile, so the next run or export skips the compile
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 75/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- python
- Domain
- build-system, testing
Research direction
Start in reflex/utils/prerequisites.py at get_compiled_app, then read how App._should_compile handles .web/nocompile and how the backend worker consumes it. Add a regression test in tests/units/utils/test_prerequisites.py that creates the marker and confirms get_compiled_app runs a compile; done means the test fails before the fix and passes after it.
Written by the indexing model from the issue text.
Description
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 runserves the old frontend until a file save triggers a hot reload.reflex exportskips 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.
- Run
reflex runonce to completion, then stop it. - Run
reflex runagain. Press Ctrl+C right afterApp running at:is printed. On a small app the window is about 0.8 s. It is longer on a larger app. - Check that
.web/nocompileexists. - Change visible text in a page, for example
rx.heading("V1")torx.heading("V2"). - Do one of these:
- Run
reflex run. NoCompiling:progress bar is shown. The browser showsV1. It staysV1until you save a file. - Run
reflex export --frontend-only --no-zip. The command exits 0, but.web/build/clientcontainsV1, notV2.
- Run
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_backendcreates the marker when a frontend is present.App._should_compiledeletes the marker and returnsFalse. 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 runafter the early Ctrl+C compiles and serves the new text.reflex exportafter 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.
- Dominant language
- Python
- Stars
- 29k
- Forks
- 1.8k
- Avg merge
- 2d 22h
- Merged PRs (30d)
- 143
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from reflex-dev/reflex
-
Operations on a list[T] | None var throw when the value is NonePossibly taken @masenf claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
reflex-dev/reflex#7826 · 1 comment ·
Maintainers usually reply within 1 day
-
PropsBase nested serialization applies parent include/exclude filters to child fieldsPossibly taken @harsh21234i claimed this 1 day ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
reflex-dev/reflex#7787 · 1 comment ·
Maintainers usually reply within 1 day
-
OTel: add trace_flags to JSON log records so unsampled trace ids are recognizablePossibly taken @ShaanGS claimed this 7 days ago. Openenhancement
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
reflex-dev/reflex#7729 · 1 comment ·
Maintainers usually reply within 1 day
-
0.9.12 changelog follow-ups: the #7132 "_get_was_touched" entry describes unreachable behaviour, #7115's hasattr/getattr change is undocumented, #7131's wordingMay be free again A pull request for this issue was closed without being merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
reflex-dev/reflex#7260 · 2 comments ·
Maintainers usually reply within 1 day
-
ClientStateVar: a component that mounts while the value is non-default never re-renders on the push back to the defaultMay be free again A pull request for this issue was closed without being merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
reflex-dev/reflex#6823 · 1 comment ·
Maintainers usually reply within 1 day
All issues in reflex-dev/reflex
Similar issues
-
[Bug]: graphify query loads every language extractor just for _file_stem (about 34 ms per call)Possibly taken @rohit-jsfreaky claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Graphify-Labs/graphify#5160 · 1 comment ·
Maintainers usually reply within 2 days
-
Variable declared without a value suppresses ${VAR:-default} expansionPossibly taken @Omarinho12345 claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
theskumar/python-dotenv#750 ·
Maintainers usually reply within 12 days
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
UKGovernmentBEIS/control-arena#947 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
jasonacox/Powerwall-Dashboard#897 · 1 comment ·
Maintainers usually reply within 1 day