Попытка создать собственный построитель приводит к неуникальной ошибке вывода

Я пытаюсь создать собственный конструктор для своего проекта Flutter. Я хочу добиться чего-то похожего на генерацию кода built_value.

Я начал с создания build.yaml в корневой папке моего проекта

targets:
  $default:
    builders:
      app|db_builder:
        enabled: true

builders:
  db_builder:
    target: ":db_builder"
    import: "package:app/db/build/builder.dart"
    builder_factories: ["dbBuilder"]
    build_extensions: {".dart": [".db.g.part"]}
    auto_apply: dependents
    build_to: cache
    applies_builders: ["source_gen|combining_builder"]

Затем реализовали dbBuilder завод на app/db/build/builder.dart

import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';

import 'db_generator.dart';

Builder dbBuilder(BuilderOptions _) =>
    SharedPartBuilder([DBAccessGenerator()], 'built_value');

DBAccessGenerator это пустой класс, унаследованный от Generator

В моем проекте также есть built_value_generator.

После вышеупомянутых шагов при запуске flutter pub run build_runner build У меня следующая ошибка:

Both app:db_builder and built_value_generator:built_value may output
test/widget_test.built_value.g.part. Potential outputs must be unique across all builders.

Почему так происходит? Я видел исходный код built_value_generator, и он объявляет расширения сборки какbuild_extensions: {".dart": [".built_value.g.part"]} но мое объявление отличается, я использую другое целевое расширение.

1 ответ

Решение

Причина внутри app/db/build/builder.dart файл.

При создании SharedPartBuilder, второй аргумент - это partId и это реальное выходное расширение сгенерированного файла, а не то, что указано в build.yaml файл.

Итак, установка другого имени здесь решает проблему.

Подробнее здесь: https://github.com/dart-lang/build/issues/2670

Другие вопросы по тегам