'rootDir' 应该包含所有源文件 [英] 'rootDir' is expected to contain all source files

查看:36
本文介绍了'rootDir' 应该包含所有源文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have an Angular CLI workspace containing two library projects, foo and bar. When I build the second of the two libraries, foo, the build fails with the following error:

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

error TS6059: File '/code/projects/bar/src/lib/types.ts' is not under 'rootDir' '/code/projects/foo/src'. 'rootDir' is expected tocontain all source files.

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

我在 此处上的沙箱存储库中重现了该错误.我已经尽可能地简化了代码,同时仍然遇到错误.您可以通过在 rootDir-expect-all-source-files-error 分支.错误的原因是什么?这可能是 ng-packagrngctsc 的错误吗?还是仅仅是配置问题?

I have reproduced the error in a sandbox repo on GitHub here. I have simplified the code to as much as I can while still experiencing the error. You can reproduce the error by executing npm run build on the rootDir-expect-all-source-files-error branch. What is the cause of the error? May this be a bug with ng-packagr or ngc or tsc? Or is it simply a configuration issue?

以下是代码更改,我可以通过这些更改使构建通过,但我想知道是什么导致代码出现错误.

Below are code changes with which I can make the build pass, but I would like to know what is causing the error with the code as is.

export class BarComponent {

  list = this.barService.list();

  constructor(private barService: BarService) {}
}

构建通行证

在构造函数中初始化列表属性而不是内联

Build passes

Initialize list property in constructor instead of inline

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 2.9 中引入的 import types 而发生的问题.当发出时,这些未正确重新接线,请参见第 3 行.

This looks like the problem that is occurring due to the import types which was introduced in TypeScript 2.9. When emitted these are not being rewired properly see line 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[]; 代替.

In the above emitted dts, list: import("projects/bar/src/lib/types").Item[]; should be something like import("./types").Item[]; instead.

对此的解决方法可以是从您的代码而不是推断类型,您显式设置它.

A workaround for this can be that from your code instead infering the type, you explicitly set it.

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

in bar.component.ts change the below;

list = this.barService.list();

到:

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

这将删除类型导入并构建消费库.

This will remove the type import and the consuming library will build.

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

I also checked a bit with future versions of TypeScript, it is still an issue in TypeScript 3.0.1, but it looks like it has been addressed in dev version of TypeScript 3.1.0, ie 3.1.0-dev.20180813

这篇关于'rootDir' 应该包含所有源文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆