“ rootDir”应包含所有源文件

时间:2018-08-14 21:32:43

标签: angular typescript angular-cli ng-packagr angular-library

我有一个Angular CLI工作区,其中包含两个库项目foobar。当我构建两个库中的第二个foo时,构建失败并显示以下错误:

  

错误TS6059:文件“ /code/projects/bar/src/lib/types.ts”不在   'rootDir''/ code / projects / foo / src'。预计“ rootDir”包含   所有源文件。

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>)

我已在GitHub here上的沙箱仓库中复制了该错误。我仍然尽可能地简化了代码,同时仍然遇到错误。您可以通过在rootDir-expect-all-source-files-error分支上执行npm run build来重现该错误。错误原因是什么?这可能是ng-packagrngctsc的错误吗?还是仅仅是配置问题?

观察

下面是我可以通过构建的代码更改,但是我想知道是什么导致了代码的错误。

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;
  }
}

3 个答案:

答案 0 :(得分:4)

这似乎是由于import types中引入的TypeScript 2.9而引起的问题。发出时,这些未正确接线,请参见第3行。

dist / bar / lib / bar.component.d.ts(5,11):

export declare class BarComponent implements OnInit {
    private barService;
    list: import("projects/bar/src/lib/types").Item[]; 
    constructor(barService: BarService);
    ngOnInit(): void;
}

在上面发出的dts中,list: import("projects/bar/src/lib/types").Item[];应该类似于import("./types").Item[];

一种解决方法是,从代码中推断出类型,然后显式设置它。

bar.component.ts中更改以下内容;

list = this.barService.list();

至:

list: Item[] = this.barService.list();

这将删除导入类型,并且将构建使用库。

我还检查了TypeScript的将来版本,它在TypeScript 3.0.1中仍然是一个问题,但看起来在dev版本的TypeScript 3.1.0中已解决,即3.1.0-dev.20180813

答案 1 :(得分:1)

我遇到了同样的问题,但是@Agius的解决方案没有帮助。

我有:

Angular Workspace
  - projects
      - lib1
      - lib2
  - src
      - test application

实际上,通过拖动WebStorm中的文件夹,我已经将组件从lib2移到了lib1。这样,不会删除lib2中对该组件的引用,而是会对其进行更新并指向lib1的源文件夹。我忘了删除lib2中不再需要的这些引用。在删除了对lib2中该组件的所有引用之后,该库便被编译。

我必须删除其中的引用

  • public_api.ts
  • ./ lib / lib2.module.ts

也许您的项目中有更多参考文献。

答案 2 :(得分:0)

问题与import语句有关,其中导入路径未正确提供。 例如:-从'../.././../tools1/tools2/tools/demo'导入*; 应该从“ @ tools / tools / demo”导入*;

此处@tools被视为根目录。 注意:-上述路径仅是示例。