我有一个Angular CLI工作区,其中包含两个库项目foo
和bar
。当我构建这两个库之一的第二个foo
时,构建失败并出现以下错误:
错误TS6059:文件'/code/projects/bar/src/lib/types.ts'不在'rootDir' '/code/projects/foo/src'下。 'rootDir'应该包含所有源文件。
我已经在 GitHub 的沙盒存储库中复制了错误 这里。我已经尽可能地简化了代码,同时仍然遇到了错误。您可以通过在rootDir-expect-all-source-files-error分支上执行
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>)
npm run build
来重现此错误。导致错误的原因是什么?这可能是ng-packagr
、ngc
或tsc
中的一个 bug 吗?还是仅仅是配置问题?观察结果
以下是我可以使构建成功的代码更改,但我想知道造成代码出现错误的原因。
bar.component.ts
构建失败
export class BarComponent { list = this.barService.list(); constructor(private barService: BarService) {} }
构建通过
在构造函数中初始化列表属性而不是内联初始化
export class BarComponent { list; constructor(private barService: BarService) { this.list = this.barService.list(); } }
bar.service.ts
构建失败
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; } }
构建通过
移除数据类型
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; } }
rootDir
属性,因此Angular CLI似乎会将其内部限制为要编译的库的根目录。然后,如果您在外部import
另一个库,TypeScript会正确地抱怨。关于rootDir
,请参见这里:https://dev59.com/tVMH5IYBdhLWcg3w92It#57429111(免责声明:我的回答)。 - ford04