Flutter的构建工具"build_runner"耗时过长。

11

我正在使用EasyLocalizationmobxJsonSerializable等技术。为了生成*.g.dart文件,我使用build_runner watch或位于scripts/build.sh中的脚本:

flutter packages pub run build_runner build

原本只需要2秒,但突然间开始至少需要10秒或有时甚至需要30秒的时间。由于这个情况,build_runner watch变得无用了,我是说自那之后它就没正常工作过。

运行脚本时在控制台上的输出:

$ sh scripts/build.sh 
[INFO] Generating build script...
[INFO] Generating build script completed, took 611ms

[INFO] Initializing inputs
[INFO] Reading cached asset graph...
[INFO] Reading cached asset graph completed, took 126ms

[INFO] Checking for updates since last build...
[INFO] Checking for updates since last build completed, took 745ms

[INFO] Running build...
[INFO] 1.2s elapsed, 0/16 actions completed.
[INFO] 2.2s elapsed, 0/16 actions completed.
[INFO] 3.3s elapsed, 0/16 actions completed.
[INFO] 12.5s elapsed, 1/17 actions completed.
[INFO] 13.6s elapsed, 4/20 actions completed.
[INFO] Running build completed, took 14.6s

[INFO] Caching finalized dependency graph...
[INFO] Caching finalized dependency graph completed, took 57ms

[INFO] Succeeded after 14.6s with 2 outputs (47 actions)

在运行时间激增期间,您的项目中的Dart文件数量是否大幅增加? - croxx5f
不是很多,我只有13个*.g.dart文件而已。 - Muhammed Aydogan
我指的是总文件数,因为构建运行器必须搜索每个文件以查找注释。也许您的项目已经变得更加庞大,即使您的代码生成需求并没有增加。 - croxx5f
是的,我在lib/目录下有167个文件。所以,你的意思是,除了等待Flutter团队修复它并加速它之外,没有其他解决办法了吗? - Muhammed Aydogan
1
对于那么大的项目来说,应该会更快一些,已知有一些解决方法,比如这里所述的方法。你可以标记那些需要代码生成的文件,并为这些特定的文件生成代码。这样可以使运行分析变得更加简单,这是一种手动优化,可以在此期间缓解你的问题。 - croxx5f
@croxx5f,我在使用build.yaml时遇到了一些问题。你能否作为回答发布一个关于mobxjson_serializablebuild.yaml文件示例? - Muhammed Aydogan
2个回答

5

除了避免在不必要的输入上运行构建器之外,我还通过禁用mockito模拟生成器(我没有使用)成功地使我的构建速度更快:

build.yaml:

targets:
  $default:
    builders:
      your_builder:
        generate_for:
          - lib/**/*.dart
      mockito:mockBuilder:
        enabled: false

运行构建会导致Mockito搜索我的每个测试文件中的@GenerateMocks。


您先生,您是我的英雄。知道还有哪些后台正在运行的扫描吗? - JJ Du Plessis
@JJDuPlessis 没有,而且很遗憾我认为也没有办法知道项目中所有活动的构建器。我之所以注意到mockito是活跃的,是因为在构建时它记录了一些信息。 - Clavum

4
我决定自己尝试解决这个问题,我通过在我的 pubspec.yaml 文件中添加以下内容进行了一些改进:例如:
targets:
  $default:
    builders:
      json_serializable:
        enabled: true
        generate_for:
          include:
            - lib/your_codegen_folder/**.dart
            - lib/**.gen.dart

希望这能加速一些。您需要为另外两个生成器添加构建器配置,就像此处的json_serializable一样。我猜它们可能被称为easy_localizationmobx?我不知道,我对此很新。

是的,我大致做了同样的事情,效果略有改善。 - Muhammed Aydogan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接