“rootDir”应包含所有源文件。

51

我有一个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 的沙盒存储库中复制了错误 这里。我已经尽可能地简化了代码,同时仍然遇到了错误。您可以通过在rootDir-expect-all-source-files-error分支上执行npm run build来重现此错误。导致错误的原因是什么?这可能是 ng-packagrngctsc 中的一个 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;
  }
}

显示的错误从TypeScript的角度来看是有意义的,但我并不真正了解Angular CLI。由于您在tsconfig中没有设置rootDir属性,因此Angular CLI似乎会将其内部限制为要编译的库的根目录。然后,如果您在外部import另一个库,TypeScript会正确地抱怨。关于rootDir,请参见这里:https://dev59.com/tVMH5IYBdhLWcg3w92It#57429111(免责声明:我的回答)。 - ford04
6个回答

11

这看起来像是由于在 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中仍然存在问题,但看起来在TypeScript 3.1.0的dev版本中已经得到解决,即3.1.0-dev.20180813。


1
A.Agius,我想验证我的项目中的dev版本TypeScript是否解决了这个问题,但是在构建库时出现了TypeScript不匹配的错误。您能否协助解决此问题[此处](https://stackoverflow.com/questions/51861942/disable-typescript-mismatch-in-ng-packagr)? - Sam Herrmann
2
太好了,谢谢!在你的帮助下,我确认了构建错误发生在版本3.1.0-dev.20180810及之前,但正如你所指出的那样,在版本3.1.0-dev.20180813中构建成功。 - Sam Herrmann

11

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

我的情况是:

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

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

我必须删除以下文件中的引用:

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

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


8

我有一个typescript项目,并遇到了一个关于同一错误的导入问题。我通过以下方式更正tsconfig.json文件中的include值来解决它。

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

希望这能有所帮助。


6
值得注意的是,需要删除 tsconfig.json 文件中的 "rootDir": 属性。 - Ovidijus Parsiunas

5

这个问题与导入语句有关,其中导入路径没有被正确提供。

例如:

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

应该是

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

这里将@tools视为根目录。 注:上述路径仅为示例。


3
如果你正在使用https://nx.dev并且出现以下错误...
我也遇到了这个问题...
它几乎让我崩溃...我无法弄清楚为什么nx不能正确构建... 它给我带来了关于我的引用项目 @scope1/lib2 和所有 .ts 文件在引用它的项目之外的大量错误... 我还注意到 dep-graph 有@scope1/lib2,但没有依赖箭头从引用库指向它...
我找到了这个修复方法:
rm -rf node_modules/.cache

我猜测NX缓存中的某些内容出现了问题...删除后,依赖图终于正确地显示了链接,并且构建开始正常工作。

2
谢谢!这是我在使用nx时遇到的问题,这个修复方法帮助解决了这个问题。 - Slartibartfast
1
我有一个类似的问题。在我的结构中,除了 index.ts 之外,还有一个 index.d.ts。这是我的问题所在。 - webprogrammer

1

对于 NX 工作区,这个错误 "... 不在 'rootDir' 下面 ..." 可以说你将某个 lib1 导入到另一个可构建的 lib2 中。此外,ts-config 中的引用也对我不起作用...

请查看这条评论:https://dev59.com/omULtIcB2Jgan1zngD47#76500288


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接