web-dev-qa-db-ja.com

'rootDir'にはすべてのソースファイルが含まれている必要があります

Angular 2つのライブラリプロジェクト、fooおよびbarを含むCLIワークスペースがあります。2つのライブラリのうち2番目のライブラリをビルドすると、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();
  }
}

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;
  }
}
11
Sam Herrmann

これは、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の問題はまだ残っていますが、TypeScript 3.1.0devバージョン、つまり3.1.0-dev.20180813で対処されているようです。

5
A. Agius

私は同じ問題を抱えていましたが、@ Agiusの解決策は役に立ちませんでした。

私が持っていた:

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

実際、WebStormのフォルダーをドラッグして、コンポーネントをlib2からlib1に移動しました。これにより、そのコンポーネントへのlib2の参照は削除されず、更新され、lib1のソースフォルダーを指していました。 lib2で不要になったこれらの参照を削除するのを忘れました。 lib2のコンポーネントへのすべての参照を削除した後、そのライブラリはコンパイルされました。

参照を削除する必要がありました

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

プロジェクトにもっと多くの参照があるかもしれません。

2
mvermand