Angular Library - ожидается, что rootDir будет содержать все исходные файлы. (environment.ts) - PullRequest
0 голосов
/ 08 ноября 2018

Я работал над своей первой библиотекой Angular 7, однако я получаю эту ошибку при попытке скомпилировать библиотеку.

Ошибка: ошибка TS6059: Файл «... environment.ts» не находится в «rootDir» «my-angular-library \ projects \ my-library \ src». Ожидается, что rootDir будет содержать все исходные файлы.

Глядя на мое дерево, у меня есть:

-projects
  -my-library
     -src
-src
  - environments

В моем классе следующий импорт:

import { environment } from "src/environments/environment";

Я проверял другие потоки, в которых они упоминали ошибки в машинописи, однако я использую последнюю версию "машинописи": "~ 3.1.1".

Другие темы упоминают о неверно настроенном rootDir. Я проверил свой проект, и у меня нет rootDir, определенного в любом из файлов конфигурации.

Мне не нужно добавлять среду в проекты?

1 Ответ

0 голосов
/ 08 ноября 2018

Все файлы, на которые ссылается библиотека, должны содержаться в каталоге project\my-library\src (или извлечены из другого модуля) для правильной сборки библиотеки.

Не думаю, что вы захотите включить файл среды прямо в вашу библиотеку.Во время сборки приложения этот файл среды будет отключен в приложении.Вместе с библиотекой вы создаете ее, а затем импортируете в уже созданное приложение, так что файл не будет надлежащим образом отключен.

Лучшее из известных мне решений - создать Tokenв вашей библиотеке и экспортируйте его из API библиотеки.Затем в приложении, использующем библиотеку, вы должны предоставить среду через контейнер DI, использующий этот токен.

Например, в вашей библиотеке вы должны сделать что-то вроде следующего:

project\my-library\src\lib\environment-token.ts

import { InjectionToken } from '@angular/core';

export let ENVIRONMENT_TOKEN = new InjectionToken('environment');

project\my-library\src\public_api.ts

export * from './lib/environment-token.ts'

project\my-library\src\lib\component.ts

import {
  Component,
  Inject
} from '@angular/core';

import {
  ENVIRONMENT_TOKEN
} from './environment-token';

@Component({
  selector: 'aa-component',
  template: `
})
export class Component {
  constructor(@Inject(ENVIRONMENT_TOKEN) private environment: any) {
  }
}

И тогда в вашем приложении вы сделаете что-то вроде следующего:

import {
  NgModule
} from '@angular/core';

import {
  YOUR_MODULE,
  ENVIRONMENT_TOKEN
} from 'YOUR_LIB_NAME';

import {
  environment
} from './environments/environment';

import {
  AppComponent
} from './app.component.ts'

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    YOUR_MODULE
  providers: [
    { provide: ENVIRONMENT_TOKEN, useFactory: () => environment }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...