[REF-1586] [WiP] Use bun as a package manager on windows

Although bun support for windows is currently extremely limited/broken,
eventually we want to migrate over to it for the installation speed gains over
npm.
This commit is contained in:
Masen Furer 2024-01-05 14:19:57 -08:00
parent ef457afe11
commit af7af376d0
No known key found for this signature in database
GPG Key ID: B0008AD22B3B3A95
3 changed files with 32 additions and 23 deletions

View File

@ -26,6 +26,8 @@ class Ext(SimpleNamespace):
CSS = ".css" CSS = ".css"
# The extension for zip files. # The extension for zip files.
ZIP = ".zip" ZIP = ".zip"
# The extension for executable files on Windows.
EXE = ".exe"
class CompileVars(SimpleNamespace): class CompileVars(SimpleNamespace):

View File

@ -27,6 +27,15 @@ def set_log_level(log_level: LogLevel):
_LOG_LEVEL = log_level _LOG_LEVEL = log_level
def is_debug() -> bool:
"""Check if the log level is debug.
Returns:
True if the log level is debug.
"""
return _LOG_LEVEL <= LogLevel.DEBUG
def print(msg: str, **kwargs): def print(msg: str, **kwargs):
"""Print a message. """Print a message.
@ -44,7 +53,7 @@ def debug(msg: str, **kwargs):
msg: The debug message. msg: The debug message.
kwargs: Keyword arguments to pass to the print function. kwargs: Keyword arguments to pass to the print function.
""" """
if _LOG_LEVEL <= LogLevel.DEBUG: if is_debug():
msg_ = f"[blue]Debug: {msg}[/blue]" msg_ = f"[blue]Debug: {msg}[/blue]"
if progress := kwargs.pop("progress", None): if progress := kwargs.pop("progress", None):
progress.console.print(msg_, **kwargs) progress.console.print(msg_, **kwargs)

View File

@ -145,16 +145,13 @@ def get_bun_version() -> version.Version | None:
def get_install_package_manager() -> str | None: def get_install_package_manager() -> str | None:
"""Get the package manager executable for installation. """Get the package manager executable for installation.
Currently on unix systems, bun is used for installation only. Currently, bun is used for installation only.
Returns: Returns:
The path to the package manager. The path to the package manager.
""" """
# On Windows, we use npm instead of bun.
if constants.IS_WINDOWS: if constants.IS_WINDOWS:
return get_package_manager() return get_config().bun_path + constants.Ext.EXE
# On other platforms, we use bun.
return get_config().bun_path return get_config().bun_path
@ -661,11 +658,6 @@ def install_bun():
Raises: Raises:
FileNotFoundError: If required packages are not found. FileNotFoundError: If required packages are not found.
""" """
# Bun is not supported on Windows.
if constants.IS_WINDOWS:
console.debug("Skipping bun installation on Windows.")
return
# Skip if bun is already installed. # Skip if bun is already installed.
if os.path.exists(get_config().bun_path) and get_bun_version() == version.parse( if os.path.exists(get_config().bun_path) and get_bun_version() == version.parse(
constants.Bun.VERSION constants.Bun.VERSION
@ -674,16 +666,25 @@ def install_bun():
return return
# if unzip is installed # if unzip is installed
unzip_path = path_ops.which("unzip") if constants.IS_WINDOWS:
if unzip_path is None: processes.new_process(
raise FileNotFoundError("Reflex requires unzip to be installed.") ["powershell", "-c", f"irm {constants.Bun.INSTALL_URL}.ps1|iex"],
env={"BUN_INSTALL": constants.Bun.ROOT_PATH},
shell=True,
run=True,
show_logs=console.is_debug(),
)
else:
unzip_path = path_ops.which("unzip")
if unzip_path is None:
raise FileNotFoundError("Reflex requires unzip to be installed.")
# Run the bun install script. # Run the bun install script.
download_and_run( download_and_run(
constants.Bun.INSTALL_URL, constants.Bun.INSTALL_URL,
f"bun-v{constants.Bun.VERSION}", f"bun-v{constants.Bun.VERSION}",
BUN_INSTALL=constants.Bun.ROOT_PATH, BUN_INSTALL=constants.Bun.ROOT_PATH,
) )
def _write_cached_procedure_file(payload: str, cache_file: str): def _write_cached_procedure_file(payload: str, cache_file: str):
@ -880,9 +881,6 @@ def validate_frontend_dependencies(init=True):
) )
raise typer.Exit(1) raise typer.Exit(1)
if constants.IS_WINDOWS:
return
if init: if init:
# we only need bun for package install on `reflex init`. # we only need bun for package install on `reflex init`.
validate_bun() validate_bun()