Предполагается, что rootDir будет содержать все исходные файлы

У меня есть рабочее пространство Angular CLI, содержащее два проекта библиотеки, foo и bar. Когда я создаю вторую из двух библиотек, foo, сборка завершается ошибкой со следующей ошибкой:

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

Я воспроизвел ошибку в репозитории песочницы на GitHub здесь. Я максимально упростил код, но при этом все еще испытываю ошибку. Вы можете воспроизвести ошибку, запустив npm run build в ветви rootDir-ожидать-все-исходные файлы-ошибка. В чем причина ошибки? Это может быть ошибка 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;
  }
}

Отображаемая ошибка имеет смысл с точки зрения TypeScript, однако я не очень разбираюсь в Angular CLI. Поскольку вы не устанавливаете свойство rootDir в своем tsconfig, Angular CLI, похоже, внутренне ограничивает его корнем библиотеки, которую вы хотите скомпилировать. Затем, если вы import другую библиотеку снаружи, TypeScript справедливо жалуется. Что касается rootDir, посмотрите здесь: stackoverflow.com/questions/57422458/… (отказ от ответственности: ответ от меня).

ford04 10.08.2019 09:54
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
29
1
35 846
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Похоже, проблема возникает из-за 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

А.Агиус, я хотел бы убедиться, что версия TypeScript для dev решает эту проблему в моем проекте, но при сборке библиотеки я получаю ошибку несоответствия TypeScript. Можете ли вы помочь с решением этой проблемы здесь?

Sam Herrmann 15.08.2018 17:43

Большое спасибо! С вашей помощью я смог подтвердить, что ошибка сборки возникает в версии 3.1.0-dev.20180810 и ранее, но сборка успешна с версией 3.1.0-dev.20180813, как вы указали.

Sam Herrmann 16.08.2018 19:49

У меня была такая же проблема, но решение @Agius не помогло.

Я имел:

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

Фактически я переместил компонент из lib2 в lib1, перетащив папку в WebStorm. Таким образом, ссылки в lib2 на этот компонент не были удалены, а обновлены и указывали на исходную папку lib1. Я забыл удалить эти ссылки, которые больше не нужны в lib2. После удаления всех ссылок на компонент в lib2 эта библиотека компилируется.

Мне пришлось удалить ссылки в

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

Может быть, в вашем проекте есть еще референсы.

проблема связана с оператором импорта, в котором путь импорта не указан должным образом. Например: - import * from '../.././../tools1/tools2/tools/demo'; должен быть импортирован * из '@ tools / tools / demo';

здесь @tools рассматривается как корневой каталог. Примечание: - указанный выше путь является лишь примером.

Другие вопросы по теме