用于库的Angular CLI 6.x环境文件

flo*_*w3r 7 javascript typescript angular-cli angular

我用新的CLI 6.x创建了一个库.我也在其中创建了一个Angular服务,我想为我的dev和prod环境使用不同的URL.所以我在我的库文件夹中创建了一个environment.ts和一个environment.prod.ts文件.

//dev
export const environment = {
  production: false,
  url: 'dev-url'
};

//prod
export const environment = {
  production: true,
  url: 'prod-url'
};
Run Code Online (Sandbox Code Playgroud)

我还在文件中添加了'fileReplacements'属性angular.json:

"configurations": {
  "production": {
    "fileReplacements": [{
      "replace": "projects/tk-shared/src/environments/environment.ts",
      "with": "projects/tk-shared/src/environments/environment.prod.ts"
    }],
    "project": "projects/tk-shared/ng-package.prod.json"
  }
}
Run Code Online (Sandbox Code Playgroud)

ng build tk-shared使用作品编译库并使用dev设置,但是在编译时ng build --prod tk-shared遇到以下错误:

Schema validation failed with the following errors: Data path "" should NOT have additional properties(fileReplacements).
Run Code Online (Sandbox Code Playgroud)

我的提示是,原因是tk-sharedprojectType: "library"物业angular.json.
无论如何,是否可以在库中使用环境文件?

flo*_*w3r 7

谢谢,@R。理查兹为我指出了正确的解决方案!这两个来源帮助我弄清楚如何正确执行此注入:LINK1LINK2

所以我做了什么...

创建了一个InjectionToken并修改了我的TkSharedModule

export const BASE_URL = new InjectionToken<string>('BASE_URL');
//...
export class TkSharedModule {
  static forRoot(host: string) {
    return {
      ngModule: TkSharedModule,
      providers: [{
        provide: BASE_URL,
        useValue: host
      }]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

environment我的文件中为此令牌提供了一个值AppModule

import {environment} from '../environments/environment';
//...
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    TkSharedModule.forRoot(environment.url)
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

最后在我的服务中注入了这个值:

//MyServiceService

import { BASE_URL } from '../tk-shared.module';

constructor(@Inject(BASE_URL) BASE_URL: string) {
  console.log('base url', BASE_URL);
}
Run Code Online (Sandbox Code Playgroud)