在 angular2 dart codegen 的情况下,pub build 会抛出错误

pub build throws errors in case of angular2 dart codegen

有一段时间我的印象是 Angular2 Dart codegen 是开发的前进方向。不幸的是,最近我似乎不能再使用 codegen 了。这是我的 pubspec.yaml,它不起作用并产生错误。仅删除 /transform/codegen 部分错误就消失了。

name: frontend
version: 0.0.1
description: Regatta frontend
author:
homepage: https://regatta.atlassian.net
documentation:

environment:
  sdk: '>=1.19.0 <2.0.0'

dependencies:
  angular2: 3.0.0-alpha
  angular2_components: 0.3.1-alpha
  reflectable: 1.0.1
  sass_transformer: 0.1.2+1
  greencat: 0.0.2
  browser: 0.10.0+2
  http: 0.11.3+9
  stream_transformers: 0.3.0+3

dev_dependencies:
  test: 0.12.19
  dart_to_js_script_rewriter: 1.0.2
  dart_style: 0.2.16
  pageloader: 2.2.5
  mockito: 1.0.1
  angular_test: 1.0.0-alpha+5

transformers:
  - sass_transformer
  - angular2/transform/codegen:
      platform_directives:
        - 'package:angular2/common.dart#COMMON_DIRECTIVES'
      platform_pipes:
        - 'package:angular2/common.dart#COMMON_PIPES'
      entry_points: web/main.dart
      resolved_identifiers:
        BrowserClient: 'package:http/browser_client.dart'
        Client: 'package:http/http.dart'
  - angular2/transform/reflection_remover:
      $include:
        - test/**_test.dart
        - web/main.dart
  - reflectable:
      entry_points:
        - web/main.dart
      formatted: true
  - test/pub_serve:
      $include: test/**_test.dart
  - dart_to_js_script_rewriter

错误信息

pub build
Loading source assets... 
Loading angular2/transform/codegen, dart_to_js_script_rewriter, sass_transformer, reflectable, test/pub_serve and reflectable/src/transform_import transformers... 
Loading angular2 and angular2/transform/reflection_remover transformers... (3.9s)
[Error from DirectiveMetadataLinker on frontend|lib/components/navigation_bar_component/navigation_bar_component.ng_summary.json with input frontend|lib/components/navigation_bar_component/navigation_bar_component.ng_meta.json]:
Missing identifier "materialProviders" needed by "NavigationBarComponent" from metadata map
[Error from DirectiveMetadataLinker on frontend|lib/components/event_list_component/event_list_component.ng_summary.json with input frontend|lib/components/event_list_component/event_list_component.ng_meta.json]:
Missing identifier "materialProviders" needed by "EventListComponent" from metadata map
[Error from DirectiveMetadataLinker on frontend|lib/components/event_detail_component/event_detail_component.ng_summary.json with input frontend|lib/components/event_detail_component/event_detail_component.ng_meta.json]:
Missing identifier "materialProviders" needed by "EventDetailComponent" from metadata map
[Error from TemplateCompiler on frontend|lib/app_component.ng_meta.json]:
Could not find Directive/Pipe entry for name: NavigationBarComponent
. Please be aware that Dart transformers have limited support for reusable, pre-defined lists of Directives/Pipes (aka "directive/pipe aliases"). See  for details.
Building frontend... (12.2s)

我建议使用标准变压器,因为它已经包含反射消除器阶段 https://github.com/dart-lang/angular2/blob/master/lib/src/transform/transformer.dart#L37

如果您必须使用备用变压器 angular2/transform/codegen,那么您需要一个使用相同变压器的 angular2_components 版本。

我尝试将此添加到您的 pubspec.yaml:

dependency_override
  angular2_components:
    path: ../../angular2_components

在我提供的路径中,我有一个 git 存储库的本地克隆,我在其中更改了 pubspec.yaml 文件以使用:

transformers:
  - angular2/transform/codegen:
  ...

这允许构建包。