Improve prerequisites check (#1454)

This commit is contained in:
Nikhil Rao 2023-07-28 16:29:50 -07:00 committed by GitHub
parent afb15109db
commit 7304351a66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 47 deletions

View File

@ -1,7 +1,6 @@
"""Reflex CLI to create, run, and deploy apps.""" """Reflex CLI to create, run, and deploy apps."""
import os import os
import platform
import signal import signal
import threading import threading
from pathlib import Path from pathlib import Path
@ -66,13 +65,14 @@ def init(
prerequisites.migrate_to_reflex() prerequisites.migrate_to_reflex()
# Set up the app directory, only if the config doesn't exist. # Set up the app directory, only if the config doesn't exist.
config = get_config()
if not os.path.exists(constants.CONFIG_FILE): if not os.path.exists(constants.CONFIG_FILE):
prerequisites.create_config(app_name) prerequisites.create_config(app_name)
prerequisites.initialize_app_directory(app_name, template) prerequisites.initialize_app_directory(app_name, template)
build.set_reflex_project_hash() build.set_reflex_project_hash()
telemetry.send("init", get_config().telemetry_enabled) telemetry.send("init", config.telemetry_enabled)
else: else:
telemetry.send("reinit", get_config().telemetry_enabled) telemetry.send("reinit", config.telemetry_enabled)
# Initialize the .gitignore. # Initialize the .gitignore.
prerequisites.initialize_gitignore() prerequisites.initialize_gitignore()
@ -98,10 +98,9 @@ def run(
backend_host: str = typer.Option(None, help="Specify the backend host."), backend_host: str = typer.Option(None, help="Specify the backend host."),
): ):
"""Run the app in the current directory.""" """Run the app in the current directory."""
if platform.system() == "Windows": # Check that the app is initialized.
console.print( prerequisites.check_initialized(frontend=frontend)
"[yellow][WARNING] We strongly advise using Windows Subsystem for Linux (WSL) for optimal performance with reflex."
)
# Set ports as os env variables to take precedence over config and # Set ports as os env variables to take precedence over config and
# .env variables(if override_os_envs flag in config is set to False). # .env variables(if override_os_envs flag in config is set to False).
build.set_os_env( build.set_os_env(
@ -110,11 +109,11 @@ def run(
backend_host=backend_host, backend_host=backend_host,
) )
frontend_port = ( # Get the ports from the config.
get_config().frontend_port if frontend_port is None else frontend_port config = get_config()
) frontend_port = config.frontend_port if frontend_port is None else frontend_port
backend_port = get_config().backend_port if backend_port is None else backend_port backend_port = config.backend_port if backend_port is None else backend_port
backend_host = get_config().backend_host if backend_host is None else backend_host backend_host = config.backend_host if backend_host is None else backend_host
# If no --frontend-only and no --backend-only, then turn on frontend and backend both # If no --frontend-only and no --backend-only, then turn on frontend and backend both
if not frontend and not backend: if not frontend and not backend:
@ -128,20 +127,6 @@ def run(
if backend and processes.is_process_on_port(backend_port): if backend and processes.is_process_on_port(backend_port):
backend_port = processes.change_or_terminate_port(backend_port, "backend") backend_port = processes.change_or_terminate_port(backend_port, "backend")
# Check that the app is initialized.
if frontend and not prerequisites.is_initialized():
console.print(
"[red]The app is not initialized. Run [bold]reflex init[/bold] first."
)
raise typer.Exit()
# Check that the template is up to date.
if frontend and not prerequisites.is_latest_template():
console.print(
"[red]The base app template has updated. Run [bold]reflex init[/bold] again."
)
raise typer.Exit()
# Get the app module. # Get the app module.
console.rule("[bold]Starting Reflex App") console.rule("[bold]Starting Reflex App")
app = prerequisites.get_app() app = prerequisites.get_app()
@ -169,7 +154,7 @@ def run(
assert setup_frontend and frontend_cmd and backend_cmd, "Invalid env" assert setup_frontend and frontend_cmd and backend_cmd, "Invalid env"
# Post a telemetry event. # Post a telemetry event.
telemetry.send(f"run-{env.value}", get_config().telemetry_enabled) telemetry.send(f"run-{env.value}", config.telemetry_enabled)
# Run the frontend and backend. # Run the frontend and backend.
if frontend: if frontend:
@ -192,7 +177,6 @@ def deploy(dry_run: bool = typer.Option(False, help="Whether to run a dry run.")
"""Deploy the app to the Reflex hosting service.""" """Deploy the app to the Reflex hosting service."""
# Get the app config. # Get the app config.
config = get_config() config = get_config()
config.api_url = prerequisites.get_production_backend_url()
# Check if the deploy url is set. # Check if the deploy url is set.
if config.rxdeploy_url is None: if config.rxdeploy_url is None:
@ -201,7 +185,7 @@ def deploy(dry_run: bool = typer.Option(False, help="Whether to run a dry run.")
# Compile the app in production mode. # Compile the app in production mode.
typer.echo("Compiling production app") typer.echo("Compiling production app")
export(for_reflex_deploy=True) export()
# Exit early if this is a dry run. # Exit early if this is a dry run.
if dry_run: if dry_run:
@ -233,28 +217,22 @@ def export(
backend: bool = typer.Option( backend: bool = typer.Option(
True, "--frontend-only", help="Export only frontend.", show_default=False True, "--frontend-only", help="Export only frontend.", show_default=False
), ),
for_reflex_deploy: bool = typer.Option(
False,
"--for-reflex-deploy",
help="Whether export the app for Reflex Deploy Service.",
),
): ):
"""Export the app to a zip file.""" """Export the app to a zip file."""
config = get_config() # Check that the app is initialized.
prerequisites.check_initialized(frontend=frontend)
if for_reflex_deploy:
# Get the app config and modify the api_url base on username and app_name.
config.api_url = prerequisites.get_production_backend_url()
# Compile the app in production mode and export it. # Compile the app in production mode and export it.
console.rule("[bold]Compiling production app and preparing for export.") console.rule("[bold]Compiling production app and preparing for export.")
if frontend: if frontend:
# ensure module can be imported and app.compile() is called # Ensure module can be imported and app.compile() is called.
prerequisites.get_app() prerequisites.get_app()
# set up .web directory and install frontend dependencies # Set up .web directory and install frontend dependencies.
build.setup_frontend(Path.cwd()) build.setup_frontend(Path.cwd())
# Export the app.
config = get_config()
build.export_app( build.export_app(
backend=backend, backend=backend,
frontend=frontend, frontend=frontend,
@ -263,7 +241,7 @@ def export(
) )
# Post a telemetry event. # Post a telemetry event.
telemetry.send("export", get_config().telemetry_enabled) telemetry.send("export", config.telemetry_enabled)
if zipping: if zipping:
console.rule( console.rule(

View File

@ -364,13 +364,38 @@ def install_frontend_packages():
) )
def is_initialized() -> bool: def check_initialized(frontend: bool = True):
"""Check whether the app is initialized. """Check that the app is initialized.
Returns: Args:
Whether the app is initialized in the current directory. frontend: Whether to check if the frontend is initialized.
Raises:
Exit: If the app is not initialized.
""" """
return os.path.exists(constants.CONFIG_FILE) and os.path.exists(constants.WEB_DIR) has_config = os.path.exists(constants.CONFIG_FILE)
has_reflex_dir = IS_WINDOWS or os.path.exists(constants.REFLEX_DIR)
has_web_dir = not frontend or os.path.exists(constants.WEB_DIR)
# Check if the app is initialized.
if not (has_config and has_reflex_dir and has_web_dir):
console.print(
f"[red]The app is not initialized. Run [bold]{constants.MODULE_NAME} init[/bold] first."
)
raise typer.Exit()
# Check that the template is up to date.
if frontend and not is_latest_template():
console.print(
"[red]The base app template has updated. Run [bold]reflex init[/bold] again."
)
raise typer.Exit()
# Print a warning for Windows users.
if IS_WINDOWS:
console.print(
"[yellow][WARNING] We strongly advise using Windows Subsystem for Linux (WSL) for optimal performance with reflex."
)
def is_latest_template() -> bool: def is_latest_template() -> bool: