web-dev-qa-db-fra.com

'rootDir' devrait contenir tous les fichiers source

J'ai un espace de travail CLI angulaire contenant deux projets de bibliothèque, foo et bar. Lorsque je construis la deuxième des deux bibliothèques, foo, la construction échoue avec l'erreur suivante:

erreur TS6059: le fichier '/code/projects/bar/src/lib/types.ts' n'est pas sous 'rootDir' '/ code/projects/foo/src'. 'rootDir' devrait contenir tous les fichiers source.

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

J'ai reproduit l'erreur dans un dépôt de sandbox sur GitHub here . J'ai simplifié le code autant que possible tout en continuant à rencontrer l'erreur. Vous pouvez reproduire l'erreur en exécutant npm run build sur la branche rootDir-expect-all-source-files-error-error . Quelle est la cause de l'erreur? Peut-il s'agir d'un bogue avec ng-packagr ou ngc ou tsc? Ou est-ce simplement un problème de configuration?

Observations

Vous trouverez ci-dessous des modifications de code avec lesquelles je peux faire passer la construction, mais j'aimerais savoir ce qui cause l'erreur avec le code tel quel.

bar.component.ts

La construction échoue

export class BarComponent {

  list = this.barService.list();

  constructor(private barService: BarService) {}
}

Construire des passes

Initialiser la propriété de liste dans le constructeur au lieu de inline

export class BarComponent {

  list;

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

bar.service.ts

La construction échoue

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

Construire des passes

Supprimer les types de données

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

Cela ressemble au problème qui se produit en raison du import types introduit dans TypeScript 2.9. Lorsqu'ils sont émis, ils ne sont pas correctement câblés, voir la ligne 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;
}

Dans la variable dts émise ci-dessus, list: import("projects/bar/src/lib/types").Item[]; devrait plutôt ressembler à import("./types").Item[];.

Une solution de contournement à cela peut être que, dans votre code, au lieu de déduire le type, vous le définissez explicitement.

dans bar.component.ts changer le ci-dessous;

list = this.barService.list();

à: 

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

Cela supprimera le type d'importation et la bibliothèque consommatrice se construira. 

J'ai également vérifié un peu avec les futures versions de TypeScript, c'est toujours un problème dans TypeScript 3.0.1, mais il semble que cela ait été résolu dans la version dev de TypeScript 3.1.0, c'est-à-dire 3.1.0-dev.20180813

4
A. Agius

J'ai eu le même problème, mais la solution de @Agius n'a pas aidé.

J'ai eu:

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

En fait, j'avais déplacé un composant de lib2 vers lib1 en faisant glisser le dossier dans WebStorm. Ainsi, les références de ce composant dans lib2 n'étaient pas supprimées mais mises à jour et pointaient vers le dossier source de lib1. J'ai oublié de supprimer ces références qui n'étaient plus nécessaires dans lib2. Après avoir supprimé toutes les références au composant dans lib2, cette bibliothèque a été compilée.

J'ai dû enlever les références dans

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

Peut-être qu'il y a plus de références dans votre projet.

1
mvermand