-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enable Django collectstatic's symlink mode #1060
Comments
Something like this solution with |
@illia-v Ah that's a good point, thank you. I hadn't tried For our in-progress next-generation buildpacks (Cloud Native Buildpacks; upstream info: https://buildpacks.io / our Python CNB: https://github.com/heroku/buildpacks-python) Django's use of absolute symlinks wouldn't be an issue, since the build time and run time paths are the same. |
Another issue I've found, is that Django's At first glance this seems like a bug or limitation of Django's As such, using These original filename assets already get deleted when using WhiteNoise's WHITENOISE_KEEP_ONLY_HASHED_FILES setting, which the Python getting started guide already uses: So whilst I'll still use
|
The classic Heroku Python buildpack automatically runs the Django `collectstatic` command: https://github.com/heroku/heroku-buildpack-python/blob/main/bin/steps/collectstatic This adds equivalent support, with a couple of improvements: - This implementation performs more checks to see whether the app is actually using the static files feature before trying to run it (reducing the number of cases where users would need to manually disable it). - The collectstatic symlink feature has been enabled, as requested in heroku/heroku-buildpack-python#1060. - Symlinked `manage.py` files are now supported, as requested in heroku/heroku-buildpack-python#972. - The error messages are finer grained/more useful. - There are many more tests (including now testing legacy vs latest Django versions, to check the CLI arguments used work for both ends of the spectrum). There is currently no way to force disable the feature (beyond removing `django.contrib.staticfiles` from `INSTALLED_APPS` in the app's Django config, or removing the `manage.py` script). Supporting this depends on us deciding how best to handle buildpack options, so will be added later, in #109. The build log output and error messages are fairly reasonable already (and a significant improvement over the classic buildpack), and will be further polished as part of the future build output overhaul. The implementation uses the new `utils::run_command_and_capture_output` added in #106. See: * https://docs.djangoproject.com/en/4.2/howto/static-files/ * https://docs.djangoproject.com/en/4.2/ref/contrib/staticfiles/ * https://docs.djangoproject.com/en/4.2/ref/settings/#settings-staticfiles Fixes #5. GUS-W-9538294.
The Python CNB (next-generation buildpack set to replace this one) already uses
However, enabling As such, this is not something we'll be implementing for the classic buildpack. |
For Django apps, the buildpack currently runs the Django management command
collectstatic
automatically as part of the build. This command by default copies the static files provided by any Django packages/the local app into the staticfiles directory.The collectstatic command has a
--link
option which enables the use of symlinks instead of file copies:https://docs.djangoproject.com/en/2.2/ref/contrib/staticfiles/#cmdoption-collectstatic-link
Using this option would save duplicating files within the app directory, reducing slug size and speeding up the build (since symlinking is quicker than copying).
This idea was proposed in #1033 - filing this issue to give somewhere to discuss the idea.
Things we'll need to investigate/consider:
--link
and are there any known bugs that prevent its use on older versions?In the meantime, anyone wanting to enable symlinks can do so by disabling the built-in collectstatic (by setting the env var
DISABLE_COLLECTSTATIC
on their app, per docs), then running collectstatic with custom command in abin/post_compile
script (see #1026).The text was updated successfully, but these errors were encountered: