【问题标题】:'rootDir' is expected to contain all source files'rootDir' 应包含所有源文件
【发布时间】:2019-01-21 19:42:09
【问题描述】:

我有一个 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;
  }
}

【问题讨论】:

  • 从 TypeScript 的角度来看,显示的错误是有意义的,但是我并不真正了解 Angular CLI。由于您没有在 tsconfig 中设置 rootDir 属性,Angular CLI 似乎在内部将其限制为您要编译的库的根目录。然后,如果你 import 外面的另一个库,TypeScript 理所当然地抱怨。关于rootDir 看这里:stackoverflow.com/questions/57422458/…(免责声明:我的回答)。

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


【解决方案1】:

我有一个打字稿项目,遇到了一个问题,抱怨导入时出现同样的错误。我已经通过更正tsconfig.json 文件中include 的值来解决它,如下所示

{
  "compilerOptions": {
    "module": "CommonJS",
    "target": "ES2017",
    "noImplicitAny": true,
    "preserveConstEnums": true,
    "outDir": "./dist",
  },
  "exclude": ["node_modules", "**/*.test.ts"],
  "include": ["src"]
}

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    我有:

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

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

    我不得不删除

    中的引用
    • public_api.ts
    • ./lib/lib2.module.ts

    也许你的项目中有更多的引用。

    【讨论】:

      【解决方案3】:

      问题与未正确提供导入路径的导入语句有关。

      例如:-

       import * from '../.././../tools1/tools2/tools/demo';
      

      应该是

      import * from '@tools/tools/demo';
      

      这里@tools被认为是根目录。 注意:- 上面提到的路径只是一个例子。

      【讨论】:

        【解决方案4】:

        如果您使用 https://nx.dev 并收到此错误...

        我也遇到过这个问题……

        这让我很生气...我不知道为什么 nx 没有正确构建...它给了我很多关于我引用的项目 @scope1/lib2 及其所有 .ts 文件的错误在引用它的项目之外...我还注意到 dep-graph 有 @scope1/lib2 但引用库中没有依赖箭头...

        我找到了这个修复:

        rm -rf node_modules/.cache
        

        我猜 nx 在缓存中有一些错误的东西......删除后,dep-graph 终于正确显示了链接并且构建开始工作

        【讨论】:

          【解决方案5】:

          这看起来是由于TypeScript 2.9 中引入的import types 而出现的问题。发出时,这些未正确重新布线,请参见第 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

          【讨论】:

          • A.Agius,我想验证 TypeScript 的 dev 版本在我的项目中解决了这个问题,但是在构建库时我收到了 TypeScript 不匹配错误。你能帮忙解决这个问题here吗?
          • 太好了,谢谢!在您的帮助下,我能够确认在版本 3.1.0-dev.20180810 及之前版本中发生了构建错误,但正如您所指出的那样,版本 3.1.0-dev.20180813 的构建是成功的。
          猜你喜欢
          • 2018-12-06
          • 1970-01-01
          • 2020-07-10
          • 2019-12-16
          • 2018-06-19
          • 2019-04-12
          • 2021-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多