У меня есть рабочее пространство 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
? Или это просто проблема конфигурации?
Ниже приведены изменения кода, с помощью которых я могу выполнить сборку, но я хотел бы знать, что вызывает ошибку с кодом как есть.
export class BarComponent {
list = this.barService.list();
constructor(private barService: BarService) {}
}
Инициализировать свойство списка в конструкторе вместо встроенного
export class BarComponent {
list;
constructor(private barService: BarService) {
this.list = this.barService.list();
}
}
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;
}
}
Похоже, проблема возникает из-за 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. Можете ли вы помочь с решением этой проблемы здесь?
Большое спасибо! С вашей помощью я смог подтвердить, что ошибка сборки возникает в версии 3.1.0-dev.20180810
и ранее, но сборка успешна с версией 3.1.0-dev.20180813
, как вы указали.
У меня была такая же проблема, но решение @Agius не помогло.
Я имел:
Angular Workspace
- projects
- lib1
- lib2
- src
- test application
Фактически я переместил компонент из lib2 в lib1, перетащив папку в WebStorm. Таким образом, ссылки в lib2 на этот компонент не были удалены, а обновлены и указывали на исходную папку lib1. Я забыл удалить эти ссылки, которые больше не нужны в lib2. После удаления всех ссылок на компонент в lib2 эта библиотека компилируется.
Мне пришлось удалить ссылки в
Может быть, в вашем проекте есть еще референсы.
проблема связана с оператором импорта, в котором путь импорта не указан должным образом. Например: - import * from '../.././../tools1/tools2/tools/demo'; должен быть импортирован * из '@ tools / tools / demo';
здесь @tools рассматривается как корневой каталог. Примечание: - указанный выше путь является лишь примером.
Отображаемая ошибка имеет смысл с точки зрения TypeScript, однако я не очень разбираюсь в Angular CLI. Поскольку вы не устанавливаете свойство
rootDir
в своем tsconfig, Angular CLI, похоже, внутренне ограничивает его корнем библиотеки, которую вы хотите скомпилировать. Затем, если выimport
другую библиотеку снаружи, TypeScript справедливо жалуется. Что касаетсяrootDir
, посмотрите здесь: stackoverflow.com/questions/57422458/… (отказ от ответственности: ответ от меня).