wake-up-neo.com

Es wird erwartet, dass 'rootDir' alle Quelldateien enthält

Ich habe einen Angular CLI-Arbeitsbereich, der zwei Bibliotheksprojekte foo und bar enthält. Beim Erstellen der zweiten der beiden Bibliotheken foo schlägt der Build mit dem folgenden Fehler fehl:

fehler TS6059: Datei '/code/projects/bar/src/lib/types.ts' befindet sich nicht unter 'rootDir' '/ code/projects/foo/src'. Es wird erwartet, dass 'rootDir' .__ enthält. alle Quelldateien.

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

Ich habe den Fehler in einem Sandbox-Repo auf GitHub hier reproduziert. Ich habe den Code so weit wie möglich vereinfacht, während der Fehler immer noch auftritt. Sie können den Fehler reproduzieren, indem Sie npm run build im Zweig rootDir-expect-all-source-files-error ausführen. Was ist die Fehlerursache? Kann dies ein Fehler mit ng-packagr oder ngc oder tsc sein? Oder ist es nur ein Konfigurationsproblem?

Beobachtungen

Nachfolgend sind Codeänderungen aufgeführt, mit denen ich den Build-Pass durchführen kann, aber ich würde gerne wissen, was den Fehler mit dem Code verursacht, wie er ist.

bar.component.ts

Build schlägt fehl

export class BarComponent {

  list = this.barService.list();

  constructor(private barService: BarService) {}
}

Baue Pässe

Listeneigenschaft im Konstruktor statt Inline initialisieren

export class BarComponent {

  list;

  constructor(private barService: BarService) {
    this.list = this.barService.list();
  }
}

bar.service.ts

Build schlägt fehl

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

Baue Pässe

Entfernen Sie die Datentypen

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

Das sieht wie das Problem aus, das aufgrund des import types auftritt, das in TypeScript 2.9 eingeführt wurde. Wenn sie ausgestrahlt werden, werden diese nicht richtig verkabelt, siehe Zeile 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;
}

In der obigen Ausgabe von dts sollte list: import("projects/bar/src/lib/types").Item[]; stattdessen etwas wie import("./types").Item[]; sein.

Eine Problemumgehung für dieses Problem kann darin bestehen, dass der Code von Ihrem Code explizit festgelegt wird.

in bar.component.ts ändere das unten;

list = this.barService.list();

zu: 

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

Dadurch wird der Typimport entfernt und die verbrauchende Bibliothek wird erstellt. 

Ich habe auch ein bisschen mit zukünftigen Versionen von TypeScript nachgesehen, es ist immer noch ein Problem in TypeScript 3.0.1, aber es sieht so aus, als ob es in dev Version von TypeScript 3.1.0 angesprochen wurde, dh 3.1.0-dev.20180813

4
A. Agius

Ich hatte das gleiche Problem, aber die Lösung von @Agius half nicht.

Ich hatte:

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

Tatsächlich hatte ich eine Komponente von lib2 nach lib1 verschoben, indem ich den Ordner in WebStorm gezogen habe. Dadurch wurden die Verweise in lib2 auf diese Komponente nicht entfernt, sondern aktualisiert und auf den Quellordner von lib1 verwiesen. Ich habe vergessen, diese Verweise zu entfernen, die in lib2 nicht mehr benötigt werden. Nach dem Entfernen aller Verweise auf die Komponente in lib2 wurde diese Bibliothek kompiliert.

Ich musste die Verweise in entfernen

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

Vielleicht gibt es mehr Referenzen in Ihrem Projekt.

1
mvermand