From 8528820d89fde995bc8d59481fef6302f441f70c Mon Sep 17 00:00:00 2001 From: Sli Date: Sat, 15 Feb 2025 12:15:08 +0100 Subject: [PATCH] Run bundler through honcho --- Procfile | 1 + pyproject.toml | 1 + staticfiles/management/commands/runserver.py | 10 +++++++--- staticfiles/processors.py | 6 ------ uv.lock | 18 ++++++++++++++++-- 5 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 Procfile diff --git a/Procfile b/Procfile new file mode 100644 index 00000000..857b2f2d --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +bundler: npm run serve \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index a4d16abc..cf09d61f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ dependencies = [ "redis[hiredis]<6.0.0,>=5.2.0", "environs[django]<15.0.0,>=14.1.0", "requests>=2.32.3", + "honcho>=2.0.0", ] [project.urls] diff --git a/staticfiles/management/commands/runserver.py b/staticfiles/management/commands/runserver.py index f093f3bd..8614d8b9 100644 --- a/staticfiles/management/commands/runserver.py +++ b/staticfiles/management/commands/runserver.py @@ -1,4 +1,7 @@ +import logging import os +import subprocess +import sys from django.conf import settings from django.contrib.staticfiles.management.commands.runserver import ( @@ -6,7 +9,7 @@ from django.contrib.staticfiles.management.commands.runserver import ( ) from django.utils.autoreload import DJANGO_AUTORELOAD_ENV -from staticfiles.processors import JSBundler, OpenApi +from staticfiles.processors import OpenApi class Command(Runserver): @@ -15,10 +18,11 @@ class Command(Runserver): def run(self, **options): # OpenApi generation needs to be before the bundler OpenApi.compile() - # Only run the bundling server when debug is enabled + # Run all other web processes but only if debug mode is enabled # Also protects from re-launching the server if django reloads it if os.environ.get(DJANGO_AUTORELOAD_ENV) is None and settings.DEBUG: - with JSBundler.runserver(): + logging.getLogger("django").info("Running complementary processes") + with subprocess.Popen([sys.executable, "-m", "honcho", "start"]): super().run(**options) return super().run(**options) diff --git a/staticfiles/processors.py b/staticfiles/processors.py index 3a0df243..bacac363 100644 --- a/staticfiles/processors.py +++ b/staticfiles/processors.py @@ -99,12 +99,6 @@ class JSBundler: if process.returncode: raise RuntimeError(f"Bundler failed with returncode {process.returncode}") - @staticmethod - def runserver() -> subprocess.Popen: - """Bundle js files automatically in background when called in debug mode.""" - logging.getLogger("django").info("Running javascript bundling server") - return subprocess.Popen(["npm", "run", "serve"]) - @staticmethod def get_manifest() -> JSBundlerManifest: return JSBundlerManifest(BUNDLED_ROOT / ".vite" / "manifest.json") diff --git a/uv.lock b/uv.lock index c76028d9..69a94a95 100644 --- a/uv.lock +++ b/uv.lock @@ -155,7 +155,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -595,6 +595,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/04/eaa88433249ddfc282018d3da4198d0b0018e48768e137bfad304aacb1ec/hiredis-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9020fd7e58f489fda6a928c31355add0e665fd6b87b21954e675cf9943eafa32", size = 22004 }, ] +[[package]] +name = "honcho" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/c8/d860888358bf5c8a6e7d78d1b508b59b0e255afd5655f243b8f65166dafd/honcho-2.0.0.tar.gz", hash = "sha256:af3815c03c634bf67d50f114253ea9fef72ecff26e4fd06b29234789ac5b8b2e", size = 45618 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/1c/25631fc359955569e63f5446dbb7022c320edf9846cbe892ee5113433a7e/honcho-2.0.0-py3-none-any.whl", hash = "sha256:56dcd04fc72d362a4befb9303b1a1a812cba5da283526fbc6509be122918ddf3", size = 22093 }, +] + [[package]] name = "ical" version = "8.3.1" @@ -807,7 +819,7 @@ version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "ghp-import" }, { name = "jinja2" }, { name = "markdown" }, @@ -1501,6 +1513,7 @@ dependencies = [ { name = "django-phonenumber-field" }, { name = "django-simple-captcha" }, { name = "environs", extra = ["django"] }, + { name = "honcho" }, { name = "ical" }, { name = "jinja2" }, { name = "libsass" }, @@ -1561,6 +1574,7 @@ requires-dist = [ { name = "django-phonenumber-field", specifier = ">=8.0.0,<9.0.0" }, { name = "django-simple-captcha", specifier = ">=0.6.0,<1.0.0" }, { name = "environs", extras = ["django"], specifier = ">=14.1.0,<15.0.0" }, + { name = "honcho", specifier = ">=2.0.0" }, { name = "ical", specifier = ">=8.3.0,<9.0.0" }, { name = "jinja2", specifier = ">=3.1.4,<4.0.0" }, { name = "libsass", specifier = ">=0.23.0,<1.0.0" },