angular

Angular4 -> 5のアップデートで Metadata version mismatch が起きたとき

More than 1 year has passed since last update.

Angular4を5へアップデートした際に、ビルドエラーが発生するようになってしまったときの対処の記録。

ことの発端

Angular5のメジャーバージョンがリリースされたので、4からアップデートしようと試みた。いつも通り ncu -u コマンドでアップデートを行った。

 @angular/animations                ^4.4.3  →  ^5.0.0   
 @angular/common                    ^4.4.3  →  ^5.0.0   
 @angular/compiler                  ^4.4.3  →  ^5.0.0   
 @angular/compiler-cli              ^4.4.3  →  ^5.0.0   
 @angular/core                      ^4.4.3  →  ^5.0.0   
 @angular/forms                     ^4.4.3  →  ^5.0.0   
 @angular/http                      ^4.4.3  →  ^5.0.0   
 @angular/platform-browser          ^4.4.3  →  ^5.0.0   
 @angular/platform-browser-dynamic  ^4.4.3  →  ^5.0.0   
 @angular/platform-server           ^4.4.3  →  ^5.0.0   
 @angular/router                    ^4.4.3  →  ^5.0.0   
 typescript                         ~2.5.2  →  ~2.6.1   
 @types/jasmine                      2.6.0  →   2.6.2   
 codelyzer                          ~3.2.0  →  ~4.0.0   
 protractor                         ~5.1.2  →  ~5.2.0   

The following dependencies are satisfied by their declar
 file anyway, run ncu -a.                               

 @angular/flex-layout  ^2.0.0-beta.9  →  ^2.0.0-beta.10 
 angularfire2            ^5.0.0-rc.2  →     ^5.0.0-rc.3 
 firebase                     ^4.4.0  →          ^4.6.0 
 rxjs                         ^5.4.3  →          ^5.5.2 
 @angular/cli                 ^1.4.3  →          ^1.5.0 
 @types/node                 ^8.0.31  →         ^8.0.47 
 tslint                       ^5.7.0  →          ^5.8.0 

その後、 ng serve で起動しようとすると次のようなエラーが吐かれた。

λ ng serve

..(省略)

ERROR in Error: Metadata version mismatch for module D:/develop/repositories/git/02_github/ne-peer/deredorm/src/app/app.module.ts, found version 3, expected 4
    at StaticSymbolResolver.getModuleMetadata (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@angular\compiler\bundles\compiler.umd.js:31805:34)
    at StaticSymbolResolver._createSymbolsOf (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@angular\compiler\bundles\compiler.umd.js:31562:46)
    at StaticSymbolResolver.resolveSymbol (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@angular\compiler\bundles\compiler.umd.js:31221:14)
    at StaticReflector.findSymbolDeclaration (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@angular\compiler\bundles\compiler.umd.js:30338:67)
    at StaticReflector.findDeclaration (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@angular\compiler\bundles\compiler.umd.js:30313:21)
    at Object.listLazyRoutesOfModule (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@angular\compiler-cli\src\ngtools_impl.js:51:37)
    at Function.NgTools_InternalApi_NG_2.listLazyRoutes (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@angular\compiler-cli\src\ngtools_api.js:91:39)
    at AotPlugin._getLazyRoutesFromNgtools (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@ngtools\webpack\src\plugin.js:241:66)
    at _donePromise.Promise.resolve.then.then.then.then.then (D:\develop\repositories\git\02_github\ne-peer\deredorm\node_modules\@ngtools\webpack\src\plugin.js:495:24)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)

軽くエラーメッセージでググっても、具体的な対処や原因がわからなかった。

npmのキャッシュかと思い、 npm cache clean を叩いてみたり、nodeのバージョンを6 -> 8に上げてみたりしたが解決せず。

解決策

似た事象の質問への回答で「angularを5系にアップデートしたなら、 @angular/compiler-cli もアップデートすること」というのを見つけた。

この記事には書いてないが、この周りの質問を見ていると「一度 npm uninstall して、再度installすること」という記事も合わせて見つけたので、次のように叩いた。

npm uninstall @angular/compiler-cli

npm install @angular/compiler-cli

その後 ng serve でローカルサーバを起動すると、エラーが発生しなくなった。