Angular 库 -“rootDir”预计包含所有源文件。(环境.ts)

JDS*_*JDS 5 angular angular7

我正在开发我的第一个 Angular 7 库,但是在尝试编译该库时收到此错误。

错误:错误 TS6059:文件“...environment.ts”不在“rootDir”“my-angular-library\projects\my-library\src”下。“rootDir”预计包含所有源文件。

看着我的树,我有:

-projects
  -my-library
     -src
-src
  - environments
Run Code Online (Sandbox Code Playgroud)

在我的课堂上,我有以下导入:

import { environment } from "src/environments/environment";
Run Code Online (Sandbox Code Playgroud)

我正在检查其他线程,他们提到了打字稿中的错误,但是我正在运行最新版本的“打字稿”:“〜3.1.1”。

其他线程提到了错误配置的 rootDir。我检查了我的项目,没有在任何配置文件中定义 rootDir。

我不需要向项目添加环境,对吗?

pei*_*ent 2

库引用的所有文件都需要包含在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');
Run Code Online (Sandbox Code Playgroud)

project\my-library\src\public_api.ts

export * from './lib/environment-token.ts'
Run Code Online (Sandbox Code Playgroud)

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) {
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的应用程序中,您将执行以下操作:

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 {}
Run Code Online (Sandbox Code Playgroud)