运行安可无阻塞

Run encore without blocking

我有一个包含很多脚本和样式的 Symfony 项目。 Encore 在生产中执行大约需要 4 分钟:

npm run encore prod

它使用 json-manifest-path 进行版本控制。虽然它正在执行,但我收到了 500 响应。错误是:

An exception has been thrown during the rendering of a template ("Asset manifest file "XXX/web/build/manifest.json" does not exist.").

这是因为清理:

Encore
    .setOutputPath('web/build/')
    .setPublicPath('/build')
    .createSharedEntry('app', './assets/js/app.js')
    .addStyleEntry('style', './assets/css/style.scss')
    // ... more assets here
    .enableSingleRuntimeChunk()
    .cleanupOutputBeforeBuild() // <------------------- cleanup
    .enableSourceMaps(!Encore.isProduction())
    .enableVersioning(Encore.isProduction())
    .enableSassLoader(function(options) {}, { resolveUrlLoader: false })
    .autoProvidejQuery()
;

我该如何避免这个问题?

你不应该在你的生产机器上 运行 encore prod(同样你不应该在那台机器上 运行 composer install)。

构建和部署是不同的步骤。

您需要 运行 在不同的地方执行所有构建步骤(至少与您实际使用的目录不同 serve应用程序),然后部署生成的“工件”(例如构建过程的结果)。

如何执行此操作取决于您的服务基础架构和部署过程,但它可以类似于:

  • 正在复制文件(mvcp 等)。
  • 将文件从构建机器传输到应用程序服务器(rsyncscpftp 等)
  • 构建 Docker 应用程序映像并推送到容器注册表。
  • 等等

无论您做什么,都需要避免 运行修改正在主动提供的文件的漫长过程。

构建过程可以很长,它们很长也没关系(尽管我们更希望它们是分类器),但部署过程应尽可能短。