Django-compressor: 没有办法让它在 Heroku 上工作

创建于 2014-03-06  ·  24评论  ·  资料来源: django-compressor/django-compressor

在网上搜索似乎没有一种直接的方法可以让它在heroku上工作。

我认为按照 heroku 推荐的文件方式将所有内容放在 S3 上将是可行的方法。 然后我读到这个: http ://django-compressor.readthedocs.org/en/latest/remote-storages/
这一切都很好,但是在完成之后它并没有说明结果是什么。 我是否同时运行 collectstatic、compress ? 我是在本地做还是让 heroku push hook 为我做? 还是我实际上禁用了heroku collectstatic,因为无论如何我在heroku环境中都没有lessc &co。

所以至少这将是这个页面的一个文档错误:http: //django-compressor.readthedocs.org/en/latest/remote-storages/

原则上,如果您离线生成所有内容并将它们检查到您的版本控制中,这也应该在 heroku 上工作,对吧?

有这些关于在 heroku 环境中设置 node 和 less 的文章,但它们似乎有点过分并且实际上不起作用:
http://marklmiddleton.com/2013/using-less-with-django-on-heroku/
http://www.sore.nu/blog/2012/dec/30/fieldguide-django-bootstrap-less-coffeescript-and-/

我在这里错过了什么吗? 在昨天花了半天时间之后,我放弃了(明确的选择是使用标准前端工具在本地编译所有内容)。

deployment

最有用的评论

好的,这是对我有用的东西,并且在 dyno 重启后幸存下来。 我在这里的主要目标是 1) 不需要仅为我的资产管道添加整个 ruby​​/JS buildpack 情况; 2)无需设置S3; 3)让它作为部署的一部分自动发生,而不需要本地步骤。

所以:

1)根据 Heroku 的说明配置白噪声。

2) 将django-libsass添加到您的要求中。

3)在您的设置文件中:

INSTALLED_APPS += ('compressor',)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
)

COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True

COMPRESS_PRECOMPILERS = (
    ('text/x-sass', 'django_libsass.SassCompiler'),
    ('text/x-scss', 'django_libsass.SassCompiler'),
)

4) 添加一个bin/post_compile文件,其中包含

python manage.py compress
python manage.py collectstatic --noinput

(请注意,这必须在 post_compile 中。由于临时文件系统,它不能成为发布任务 - 如果您在发布任务中运行它们,您在压缩期间生成的文件将不会保留。但在 post_compile 中运行它们似乎有效,并在测功机重启中幸存下来。)

所有24条评论

不是错误;)

但是有很多问题;)

  • 在大多数负载场景中,我会使用dj-static (如heroku 文档中所见)或whitenoise来在 heroku 上提供静态文件。
  • 如果一切配置正常,heroku 会在您推送代码时为您运行collectstatic
  • 如果你想添加离线压缩,你可以添加一个为你运行压缩的post_compile脚本(见这里
  • 不要在本地离线压缩,让heroku为你做这件事。
  • 在 heroku 上安装lessc是另一项任务,我也必须谷歌并尝试..但是你的第一个链接看起来很有希望(至少post_compile脚本)。

在上面“使用静态文件”下链接的部分中,仍然不知道为什么需要创建自己的存储子类或完成后需要做什么。

我尝试在heroku上安装lessc,但是如果给出的post_compile脚本不能直接工作,那么调试起来非常乏味,坦率地说,创建一个包含所有东西和厨房水槽的容器听起来不是一个好主意。

惊讶于这仍然有多难,但如果有人告诉我这里发生了什么:http: //django-compressor.readthedocs.org/en/latest/remote-storages/
我很乐意添加文档补丁。

我创建了一个 django-skel 的分支,它支持 django-compressor、scss 编译、凉亭和一堆其他东西(并让它在 heroku 上运行)。 有人有兴趣看吗?

我认为人们肯定会对看到有效的东西感兴趣!

@therippa :我也有兴趣看到这一点。

Compressor 的在线模式在 Heroku 上不起作用,因为 Whitenoise 仅在加载应用程序时检查静态文件夹(请参阅我对问题 #680 的评论)。 要在生产中使用压缩器,我认为您需要在离线模式下使用它并在使用 Heroku 的编译后挂钩加载应用程序之前运行python manage.py compress 。 Heroku 会自动为您运行 collect static ,所以这不是问题。 我发现heroku-django-cookbook很有帮助。 我在我的 Django/Heroku 应用程序上使用 TypeScript,所以我还需要安装节点等。这可以通过编译后挂钩、自定义 pip 包或自定义构建包来实现。 我认为编译后挂钩是最简单的方法。

由于我在与 sekizai 结合使用时遇到了这个问题,因此使用离线压缩并不是一个真正的选择。 但是这个问题实际上很容易解决扩展白噪声,所以这是我的解决方案: https ://gist.github.com/Chronial/45ce9f33615a3b24c51f

也许有人想为此添加一些测试和文档并将适当的 PR 发送到 whitenoise? :)

注意:如果您仍然想要预生成或 heroku,您可以启动服务器并在post_build挂钩中发送一些请求。

Whitenoise 文档在http://whitenoise.evans.io/en/stable/django.html#django-compressor提到 django-compressor

好的。 这对我很有用!
在我的本地根目录(又名 repo)中,我创建了一个目录bin/并在其中创建了一个名为post_compile的文件。 在post_compile文件中,我复制粘贴了这些数据
我做git add --allgit commit -m 'testing post_receive hook in Heroku'git push heroku master
在 Heroku 自动运行collectstatic命令后,它确实运行python manage.py compress并且它确实创建了一个目录,其中包含我压缩在一个文件中的所有文件!

remote:      $ python manage.py collectstatic --noinput
remote:        1247 static files copied to '/app/staticfiles'.
remote: 
remote: -----> Running post-compile hook
remote: -----> Compressing static files
remote:        Found 'compress' tags in:
remote:         /app/templates/base/base.html
remote:         /app/templates/info/areas.html
remote:         /app/templates/info/profile.html
remote:        Compressing... done
remote:        Compressed 1 block(s) from 3 template(s) for 1 context(s).

如果您看到 OfflineCompressionErrors,还请查看https://github.com/django-compressor/django-compressor/issues/443 ,人们建议更多解决方法。

在#831 的情况下,有效的是在本地进行离线压缩,并将包含 manifest.json 的结果推送到 heroku。 不过那里没有S3。

这是另一个适用于作者的配置: https ://github.com/django-compressor/django-compressor/issues/855#issuecomment -303294202

好的,这是对我有用的东西,并且在 dyno 重启后幸存下来。 我在这里的主要目标是 1) 不需要仅为我的资产管道添加整个 ruby​​/JS buildpack 情况; 2)无需设置S3; 3)让它作为部署的一部分自动发生,而不需要本地步骤。

所以:

1)根据 Heroku 的说明配置白噪声。

2) 将django-libsass添加到您的要求中。

3)在您的设置文件中:

INSTALLED_APPS += ('compressor',)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
)

COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True

COMPRESS_PRECOMPILERS = (
    ('text/x-sass', 'django_libsass.SassCompiler'),
    ('text/x-scss', 'django_libsass.SassCompiler'),
)

4) 添加一个bin/post_compile文件,其中包含

python manage.py compress
python manage.py collectstatic --noinput

(请注意,这必须在 post_compile 中。由于临时文件系统,它不能成为发布任务 - 如果您在发布任务中运行它们,您在压缩期间生成的文件将不会保留。但在 post_compile 中运行它们似乎有效,并在测功机重启中幸存下来。)

@thatandromeda解决方案对我有用,非常感谢!

@thatandromeda这个解决方案可能正是我正在寻找的(经过 12 小时的大量尝试)。 bin/post_compile 到底去哪儿了? 我将如何添加它? 我如何告诉heroku使用它?

@manikos @thatandromeda我应该在collectstatic之前还是之后运行,还是在compress之前和之后都运行? 我的压缩管理命令说找不到文件:

ValueError: The file 'css/font-awesome.min.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage object at 0x7f3e3fc3b828>.

@typistX您不必告诉heroku任何东西,它会自动检测您的项目根目录(repo)中是否有一个名为bin的目录,以及是否有一个名为post_compile的文件(没有文件扩展名)在里面。

@thatandromeda在处理了这个废话 3 天后,你才救了我。 🙏🏼

对不起,你有这样的挣扎/很高兴我能帮上忙!

@technolingo压缩需要在 collectstatic 之后运行。

@thatandromeda@manikos这两种解决方案都对我有用,谢谢! 😃
已确认这不是错误,只是缺少有关 Heroku 部署过程的信息,在文档中的某处提到它肯定会有所帮助。

我很乐意审查和合并任何拉取请求改进文档。 没有一个活跃的维护者拥有 heroku 帐户,所以这实际上取决于建议更改的用户。

在这里欢迎一键部署按钮到heroku吗? 或者只是一个逐步完成heroku部署的文档?

@morenoh149在我看来,这里最需要的是文档,“一键部署按钮”可能会有所帮助,但是当我搜索错误时,我想知道问题到底出在哪里。

此页面是否有帮助?
0 / 5 - 0 等级