Flutter的 vector_graphics_compiler转换器在GitLab CI运行flutter test时,会导致悄无声息的内存溢出(OOM)和超时

人工智能 2026-07-09

我最近将一个大型Flutter项目从flutter_svg迁移到vector_graphics,以提升渲染性能。

我的项目中大概有数百个,甚至成千上万个.svg文件。我正在使用官方的资源转换器方法,在构建时将这些SVG预编译为二进制的.vec格式。我的pubspec.yaml中包含许多像下面这样的条目:

flutter:
  assets:
    - path: assets/images/media_player/
      transformers:
        - package: vector_graphics_compiler

问题:

这在本地机器上效果很棒。第一次运行需要一段时间来编译,但后续运行很快,因为Flutter会缓存已编译的资源。

然而,当我把代码推送到GitLab CI时,流水线在一个新的Docker容器中运行,RAM有所限制。当流水线执行flutter test时,Flutter的资源打包器会在测试开始前尝试同时编译所有这些SVG文件。这会完全压垮CI运行器,导致它无声地内存耗尽(OOM),并无限期地挂起,直到达到1 小时的作业超时。

我的约束条件:

  • 我不想在本地预先编译.vec文件并提交到Git。我希望保持代码仓库的整洁,只跟踪源文件.svg。

  • 我正在运行标准的单元/小部件测试(没有需要实际渲染SVG的 Golden测试)。

我的问题:

  • 有没有办法让flutter test完全忽略或跳过asset transformer这一步?

  • 或者,是否有办法限制Flutter的内部资产打包器的并发,让它按顺序处理这些SVG,而不是让CI运行器的内存崩溃?

非常感谢任何关于CI环境的帮助或变通方案!

解决方案

我使用的方案是在测试运行之前,先用 sed 修改 pubspec.yaml 文件,以从transformers部分移除 package: vector_graphics_compiler,这样在测试期间很可能不会渲染SVG文件。

类似的代码(使用AI修改我的代码——我的实现是从一个内部包中编辑的)

sed -i "/- package: vector_graphics_compiler/d" pubspec.yaml
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章