I have an Angular CLI workspace containing two library projects, foo
and bar
. When I build the second of the two libraries, foo
, the build fails with the following error:
error TS6059: File '/code/projects/bar/src/lib/types.ts' is not under
'rootDir' '/code/projects/foo/src'. 'rootDir' is expected tocontain
all source files.
Error: error TS6059: File '/code/projects/bar/src/lib/types.ts' is not under 'rootDir' '/code/projects/foo/src'. 'rootDir' is expected to contain all source files.
at Object.<anonymous> (/code/node_modules/ng-packagr/lib/ngc/compile-source-files.js:53:68)
at Generator.next (<anonymous>)
at /code/node_modules/ng-packagr/lib/ngc/compile-source-files.js:7:71
at new Promise (<anonymous>)
at __awaiter (/code/node_modules/ng-packagr/lib/ngc/compile-source-files.js:3:12)
at Object.compileSourceFiles (/code/node_modules/ng-packagr/lib/ngc/compile-source-files.js:19:12)
at Object.<anonymous> (/code/node_modules/ng-packagr/lib/ng-v5/entry-point/ts/compile-ngc.transform.js:26:32)
at Generator.next (<anonymous>)
at /code/node_modules/ng-packagr/lib/ng-v5/entry-point/ts/compile-ngc.transform.js:7:71
at new Promise (<anonymous>)
I have reproduced the error in a sandbox repo on GitHub here. I have simplified the code to as much as I can while still experiencing the error. You can reproduce the error by executing npm run build
on the rootDir-expect-all-source-files-error branch. What is the cause of the error? May this be a bug with ng-packagr
or ngc
or tsc
? Or is it simply a configuration issue?
Observations
Below are code changes with which I can make the build pass, but I would like to know what is causing the error with the code as is.
bar.component.ts
Build fails
export class BarComponent {
list = this.barService.list();
constructor(private barService: BarService) {}
}
Build passes
Initialize list property in constructor instead of inline
export class BarComponent {
list;
constructor(private barService: BarService) {
this.list = this.barService.list();
}
}
bar.service.ts
Build fails
import { Injectable } from '@angular/core';
import { List, Item } from './types';
@Injectable({
providedIn: 'root'
})
export class BarService {
private _list: List = [];
constructor() { }
add(item: Item): void {
this._list.push(item);
}
list(): List {
return this._list;
}
}
Build passes
Remove the data types
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class BarService {
private _list: any[] = [];
constructor() { }
add(item: any): void {
this._list.push(item);
}
list(): any {
return this._list;
}
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…