Angular v6で、ライブラリをビルドしようとすると、非常に説明のつかないBUILD ERROR Cannot read property 'type' of null
BUILD ERROR
Cannot read property 'type' of null
TypeError: Cannot read property 'type' of null
at /Users/John/apps/tests/service-work/node_modules/@angular/compiler/bundles/compiler.umd.js:15378:27
at Array.forEach (<anonymous>)
at removeSummaryDuplicates (/Users/John/apps/tests/service-work/node_modules/@angular/compiler/bundles/compiler.umd.js:15377:11)
at TemplateParser.tryParseHtml (/Users/John/apps/tests/service-work/node_modules/@angular/compiler/bundles/compiler.umd.js:14806:34)
at TemplateParser.tryParse (/Users/John/apps/tests/service-work/node_modules/@angular/compiler/bundles/compiler.umd.js:14799:21)
at TemplateParser.parse (/Users/John/apps/tests/service-work/node_modules/@angular/compiler/bundles/compiler.umd.js:14780:27)
at AotCompiler._parseTemplate (/Users/John/apps/tests/service-work/node_modules/@angular/compiler/bundles/compiler.umd.js:20483:43)
at AotCompiler._createTypeCheckBlock (/Users/John/apps/tests/service-work/node_modules/@angular/compiler/bundles/compiler.umd.js:20250:23)
at /Users/John/apps/tests/service-work/node_modules/@angular/compiler/bundles/compiler.umd.js:20220:27
at Array.forEach (<anonymous>)
この問題はすでに解決されているので、この投稿を作成して、この問題に遭遇している他の人を助けます。
この問題の私の診断は間違っていたようです(私はそれをどのように修正したのか正確に思い出せないので、長い間経っています)。 正しい診断のように聞こえるものについては、Angular repo でこの問題を確認してください、
だから、たくさんのデバッグの後、私はそれを理解しました:
私のカスタムライブラリは、ライブラリAと呼び、別のカスタムライブラリであるライブラリBをライブラリAのNgModule
にインポートします。ライブラリBは、そのメインNgModule
からいくつかのコンポーネントとモジュールをエクスポートします。問題は、ライブラリBがNgModule
からコンポーネントとモジュールをエクスポートする一方で、I failedがjavascript/TypeScriptを介してそれらのコンポーネントとモジュールもエクスポートすることでした。解決策は、NgModule
にエクスポートしたTypeScriptを介してコンポーネント/モジュールを確実にエクスポートすることでした。
問題コードの例
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { LibraryBComponent } from './library-b.component';
@NgModule({
imports: [CommonModule],
declarations: [LibraryBComponent],
exports: [LibraryBComponent],
})
export class LibraryBModule {}
ソリューションコード
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { LibraryBComponent } from './library-b.component';
export { LibraryBComponent } // <-- addition
@NgModule({
imports: [CommonModule],
declarations: [LibraryBComponent],
exports: [LibraryBComponent],
})
export class LibraryBModule {}
同じエラーメッセージでこのページに到達しましたが、Angularライブラリの開発時にyarn link
を使用してnotで解決しました。
これは、デフォルトのライブラリファイルがtsconfig.json
ファイルですでに解決されているためです。だから私のプロジェクトではangularがこれを生成しました:
// tsconfig.json
...
"paths": {
"lib-core": [
"dist/lib-core"
],
"lib-core/*": [
"dist/lib-core/*"
],
次に、ライブラリパッケージと(ライブラリを使用する)アプリパッケージを開発しているときに、2つのターミナルを実行します。
ng build --project=lib-core --watch
ng serve --project=my-app
したがって、yarn link
は必要なく、そのエラーメッセージも表示されません。
私の問題は<projectRoot>/tsconfig.json
でした( #24143(comment) で確認できます)
基本的に私はtsconfig.json
からパスを削除する必要がありました:
"library-b": [
"dist/library-b"
],
"library-b/*": [
"dist/library-b/*"
]
このスレッドは少し古いことを知っていますが、これは誰かがこれに遭遇するのを助けるかもしれません。
Angular 9ライブラリがいくつかのAngularライブラリを消費しているマテリアルコンポーネントとライブラリを消費しているマテリアルコンポーネント)で同じ問題を抱えていましたアイビーを使用しています。
FullTemplateTypeCheckを追加してfalseに設定するとエラーが抑制されますが、欠点としては、発生する可能性のある他のエラーが抑制される可能性があります。
https://github.com/ng-packagr/ng-packagr/issues/1087
例tsconfig.lib.json
"angularCompilerOptions": {
"fullTemplateTypeCheck": false,
},
別のAngularライブラリを使用するAngularライブラリを開発しているときに、同じ問題が発生しました。
まず、関連する依存関係のバージョンをアップグレードして、問題が解決するかどうかを確認することをお勧めします。
// initial versions (did not work)
"@angular-devkit/build-angular": "~0.13.0",
"@angular-devkit/build-ng-packagr": "~0.13.0",
"@angular/cli": "~7.3.1",
"@angular/compiler-cli": "~7.2.0",
// updated versions (works!)
"@angular-devkit/build-angular": "~0.13.8",
"@angular-devkit/build-ng-packagr": "~0.13.8",
"@angular/cli": "~7.3.8",
"@angular/compiler-cli": "~7.2.14",
これでうまくいきました。
Johnが提案した解決策も機能するのではないかと疑っています(使用した推移的なライブラリを再エクスポートしなかったため)、古いバージョンのAngularライブラリ開発ツールを使用している場合に必要です。ただし、 Angular lib dev toolsをアップグレードするだけの場合は必要ないかもしれません。