Răsfoiți Sursa

Stop double compiles in dev mode (#1990)

Nikhil Rao 1 an în urmă
părinte
comite
e7f0cd8e4c
4 a modificat fișierele cu 33 adăugiri și 1 ștergeri
  1. 21 1
      reflex/app.py
  2. 2 0
      reflex/constants/__init__.py
  3. 3 0
      reflex/constants/compiler.py
  4. 7 0
      reflex/utils/exec.py

+ 21 - 1
reflex/app.py

@@ -593,10 +593,30 @@ class App(Base):
             parent = child
         return root
 
+    def _should_compile(self) -> bool:
+        """Check if the app should be compiled.
+
+        Returns:
+            Whether the app should be compiled.
+        """
+        # Check the environment variable.
+        if os.environ.get(constants.SKIP_COMPILE_ENV_VAR) == "yes":
+            return False
+
+        # Check the nocompile file.
+        if os.path.exists(constants.NOCOMPILE_FILE):
+            # Delete the nocompile file
+            os.remove(constants.NOCOMPILE_FILE)
+            return False
+
+        # By default, compile the app.
+        return True
+
     def compile(self):
         """Compile the app and output it to the pages folder."""
-        if os.environ.get(constants.SKIP_COMPILE_ENV_VAR) == "yes":
+        if not self._should_compile():
             return
+
         # Create a progress bar.
         progress = Progress(
             *Progress.get_default_columns()[:-1],

+ 2 - 0
reflex/constants/__init__.py

@@ -17,6 +17,7 @@ from .base import (
     Templates,
 )
 from .compiler import (
+    NOCOMPILE_FILE,
     SETTER_PREFIX,
     CompileVars,
     ComponentName,
@@ -70,6 +71,7 @@ __ALL__ = [
     LogLevel,
     Next,
     Node,
+    NOCOMPILE_FILE,
     PackageJson,
     PageNames,
     Page404,

+ 3 - 0
reflex/constants/compiler.py

@@ -5,6 +5,9 @@ from types import SimpleNamespace
 # The prefix used to create setters for state vars.
 SETTER_PREFIX = "set_"
 
+# The file used to specify no compilation.
+NOCOMPILE_FILE = ".web/nocompile"
+
 
 class Ext(SimpleNamespace):
     """Extension used in Reflex."""

+ 7 - 0
reflex/utils/exec.py

@@ -154,6 +154,13 @@ def run_backend(
     """
     config = get_config()
     app_module = f"{config.app_name}.{config.app_name}:{constants.CompileVars.APP}"
+
+    # Create a .nocompile file to skip compile for backend.
+    if os.path.exists(constants.Dirs.WEB):
+        with open(constants.NOCOMPILE_FILE, "w"):
+            pass
+
+    # Run the backend in development mode.
     uvicorn.run(
         app=f"{app_module}.{constants.CompileVars.API}",
         host=host,