Heroku 上的 webpack 和 django:collectstatic 之前的捆绑

Posted

技术标签:

【中文标题】Heroku 上的 webpack 和 django:collectstatic 之前的捆绑【英文标题】:webpack and django on Heroku: bundling before collectstatic 【发布时间】:2018-02-25 06:28:06 【问题描述】:

我正在 Heroku 上构建一个 django+react 应用程序,使用 django-npm 自动安装从 package.jsonnode-modules 目录的所有模块,然后在 python manage.py collectstatic 期间将所有内容复制到 staticfiles/(由 Heroku 触发在部署期间)。

但是,要使此配置正常工作,我需要在部署之前预先捆绑我的 React 应用程序,并将其与所有 CSS、字体等一起放入我的 static 文件夹中,以便稍后由 collectstatic 获取。

但我不想用新的捆绑版本污染我的 git 差异。那么,有没有办法让 webpack 在部署时创建一个 bundle?

我知道 Heroku 上有一个 release 命令,我可以在其中放置我的 npm run build。但问题是它只在collectstatic 之后触发,所以我的包只会在扫描此文件夹后在static/ 文件夹中创建,并且不会被复制到staticfiles 目录。

【问题讨论】:

为什么不在 npm build 之后在 heroku release 命令中重新运行 collectstatic。类似release: npm run build && python manage.py collectstatic 【参考方案1】:

更新: 自 2019 年 3 月 11 日起,不再需要使用 bin/pre_compile。Heroku 现在将在 Heroku 的构建过程中自动调用应用程序的 build 脚本(如果在 package.json 中定义)。来源:Heroku Changelog。


原文:您可以使用heroku/python buildpack 公开的(未记录的)pre_compile 挂钩来完成此操作。

在应用的顶层添加一个名为 bin/pre_compile 的可执行 shell 文件,它会在构建过程中为 called automatically。

cd my-django-app
mkdir bin
echo '#!/usr/bin/env bash' >> bin/pre_compile
echo 'npm run build' >> bin/pre_compile
chmod +x bin/pre_compile

【讨论】:

以上是关于Heroku 上的 webpack 和 django:collectstatic 之前的捆绑的主要内容,如果未能解决你的问题,请参考以下文章

Express/Webpack 在 dokku 和 heroku 上失败

如何将 Rails + Webpacker 应用程序部署到 Heroku?

在 Heroku 上部署 AngularJs + webpack + gulp

如何将使用 Webpack 的节点部署到 heroku

Rails 5.2 和 webpacker 3.4.3:部署到 Heroku 时资产未编译

错误:部署到 heroku 时找不到模块“webpack”