Сгенерировать HTML-файл компонента angular с помощью builder

#angular #dart #angular-dart

#angular #dart #angular-dart

Вопрос:

Я пишу пакет angular ( _shared_angular ), который предоставляет компонент angular. .html Файл этого компонента должен быть сгенерирован, хотя бы потому, что он будет основан на других файлах.

Я не хочу, чтобы .html файл возвращался, и я хочу, чтобы он был сгенерирован с помощью системы сборки по умолчанию.

Я пытался написать для него builder, но мне трудно сгенерировать файл для самого пакета… сгенерированный файл всегда помещается в фактический корневой пакет (который включает мой пакет).

Вот как build.yaml выглядит мой:

 targets:
  $default:
    builders:
      _shared_angular|iconsBuilder:
        generate_for:
        - lib/$lib$

builders:
  _shared_angular|iconsBuilder:
    import: "package:_shared_angular/builders/icons_builder.dart"
    builder_factories: ["iconsBuilder"]
    build_extensions: {"lib/$lib$": ["package:_shared_angular/lib/components/icon/icon_component.html"]}
    build_to: cache
    auto_apply: dependents
    runs_before:
    - angular
  

и вот как выглядит мой builder:

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

Builder iconsBuilder(BuilderOptions options) => IconsBuilder();

class IconsBuilder implements Builder {
  @override
  final buildExtensions = const {
    r'lib/$lib$': ['package:_shared_angular/lib/components/icon/icon_component.html']
  };

  @override
  build(BuildStep buildStep) async {
    final templateContent = await _getTemplateContent(buildStep.findAssets(Glob('package:_shared_angular/lib/components/icon/src/*.svg'));
    await buildStep.writeAsString(
        AssetId('_shared_angular', 'lib/components/icon/icon_component.html'), templateContent);
  }
}
  

Но это не работает.


РЕДАКТИРОВАТЬ: Это сработало, когда я заменил buildExtensions это: r'lib/$lib$': ['lib/components/icon/icon_component.html'] но я не понимаю, почему…

Ответ №1:

Причина, по которой это не сработало должным образом, заключалась в том, что auto_apply должно быть none , но внутри целевого объекта оно должно гласить: enabled: true вот так:

 targets:
  $default:
    builders:
      _shared_angular|iconsBuilder:
        enabled: true