“rootDir”预计包含所有源文件

问题描述 投票:0回答:7

我有一个 Angular CLI 工作区,其中包含两个库项目:

foo
bar
。当我构建两个库中的第二个库时,
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-packagr
ngc
tsc
的错误吗?还是只是配置问题?

观察结果

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

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

酒吧.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;
  }
}
angular typescript angular-cli ng-packagr angular-library
7个回答
11
投票

这看起来像是由于

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


11
投票

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

我有:

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

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

我必须删除

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

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


10
投票

我有一个打字稿项目,并遇到了一个问题,抱怨导入时出现相同的错误。我通过更正

include
文件中
tsconfig.json
的值解决了这个问题,如下所示

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

希望这会有所帮助。


6
投票

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

例如:-

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

应该是

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

这里

@tools
被认为是根目录。 注意:- 上述路径只是一个示例。


5
投票

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

我也遇到这个问题了...

这简直要了我的命……我不明白为什么 nx 没有正确构建……它给了我很多关于我引用的项目 @scope1/lib2 之一及其所有 .ts 文件都在外部的错误引用它的项目...我还注意到 dep-graph 有 @scope1/lib2 但引用库中没有依赖项箭头...

我找到了这个修复:

rm -rf node_modules/.cache

我猜测 nx 的缓存中存在错误的内容...删除后,dep-graph 最终正确显示了链接并且构建开始工作


1
投票

对于 NX 工作区,此错误“...不在'rootDir'下。...”可以表示您将一些 lib1 导入到另一个可构建的 lib2。另外引用 inc ts-config 对我不起作用......

检查此评论:https://stackoverflow.com/a/76500288/9026103


0
投票

对于我的 NX Repo,我在由

*.ngtypecheck.ts
自动生成的
@ngtools/webpack
文件中收到此错误。

要修复该错误,我必须删除

implicitDependencies
文件中
project.json
的引用。

所以,我们有这个项目:

{
  "name": "icons"
}

然后这个引用图标项目的项目:

{
  "name": "button",
  "implicitDependencies": ["!icons"]
}

通过从列表中删除

"!icons"
,错误消失了。

© www.soinside.com 2019 - 2024. All rights reserved.