如何在 Laravel 测试时跳过 Webpack
让我们谈谈如何在 CI 管道中摆脱 NodeJS。
我运行 Chipper CI(Laravel 的持续集成)。 我一直很恼火的是,Webpack 构建比 CI 管道的实际 有价值 部分花费更多时间并导致更多问题。
我们中的大多数人只需要运行我们的测试并可能开始部署。 节点构建任务会增加大量时间,并且需要更多的 CPU/RAM 使用率。
如果我们只是在管道中不需要 Node 怎么办? 我们能不能……不能?
答案是:当然,也许!
功能测试
很多时候,在 CI 管道中构建静态资产的唯一原因是生成 mix-manifest.json
文件。
这允许在运行 Laravel Feature 测试时使用 mix()
助手函数。 功能测试会向你的应用程序发出 HTTP 调用,因此通常会呈现使用 mix() 助手函数的 blade 模板。
如果你没有 manifest 文件,则会引发错误!
生成此清单文件涉及构建你的静态资源 - 换句话说,使用 npm(或 yarn)安装依赖项并运行 Webpack 任务:
# Build static assets
npm ci --no-audit
npm run dev
旁注:你肯定应该提交了你的
package-lock.json
文件并运行npm ci -- no-audit
而不是npm install
!
如果查看你的 public/mix-manifest.json
文件,它可能看起来像这样(有或没有哈希,取决于您是否启用了版本控制)
{
"/js/app.js": "/js/app.js",
"/js/foo.js": "/js/foo.js",
"/css/app.css": "/css/app.css"
}
事实上你不一定需要此文件来进行测试!
在你测试的 setUp()
方法中,可以添加以下魔法:
protected function setUp(): void
{
parent::setUp();
$this->withoutMix();
}
有了这些,mix()
助手将不会返回任何缺少清单文件的错误。 您的测试无需运行 NodeJS 任务即可通过!
你可以做的另一件事是复制的 CI 管道创建一个清单文件以进行测试。
假设我们的 Mix 配置生成了上面的 mix-manifest.json 文件。 我们可以将一个虚拟清单文件提交到tests/mix-manifest.json
,它总是可用的!
然后,在我们的 CI 管道脚本中,我们可以使用该文件而不是安装/构建我们的 Node 依赖项:
- 如果我们创建一个 mix-manifest.json 文件只是为了测试呢?
- 在 CI 中,我们可以将它移动到需要的地方去
cp tests/mix-manifest.json public/mix-manifest.json
然后运行你的测试,不需要 NodeJS!
php artisan test
有了这个文件,mix()
助手函数就可以工作了,并且您的功能测试可以顺利通过!
创建正确的 manifest 文件可以帮助您在 CI 管道中节省大量时间和服务器资源
当您向根目录下的 manifest 文件添加新文件的同时也应更新 tests 目录下的 manifest 文件
什么时候需要构建前端资源?
有时,您需要在 CI 管道中构建前端资源!以下是您需要注意的最常见情况:
- 当您构建生产环境的前端资源时将它们打包到可部署的 “artifact” (zip 文件、容器镜像等)
- 当您在测试中运行其他 node 命令时,例如
eslint
- 当你使用 Laravel Dusk 进行浏览器测试时
如果我需要构建静态资源怎么办?
即使你需要在 CI 脚本中构建静态资源,你仍然可以节省宝贵的时间!
我最喜欢的包是 Airdrop(作者 Aaron Francis)。 它可以帮助您构建静态资源 仅 如果它们在提交之间发生了更改。 如果它们没有更改,您可以从 S3 等文件系统驱动程序下载它们。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。