在环境文件中合并不同的配置文件



我正在尝试在环境文件中导入/合并单独的配置文件,以提供具有当前环境的所有正确属性的进一步全局 CONFIG 对象。

config/production.ts:

export const APP_CONFIG = {
api: {
root: 'https://api.example.com'
},
cookie: {
domain: '.example.com'
},
serviceWorker: {
enabled: true
}
// ... many more more properties
};

config/local.ts

export const APP_CONFIG = {
// ... only properties that are different from production
api: {
root: 'http://api.example.local'
},
cookie: {
domain: '.example.local'
},
serviceWorker: {
enabled: false
}
};

config/dev.ts

export const APP_CONFIG = {
// ... only properties that are different from production
api: {
root: 'http://localhost:8001'
},
cookie: {
domain: 'localhost'
}
};

还有一个用于测试环境的配置文件。

然后environment.prod.ts

import { APP_CONFIG } from '../config/production';
export const environment = {
production: true,
CONFIG: APP_CONFIG
};

environment.ts

import { APP_CONFIG as CONF_PROD } from '../config/production';
import { APP_CONFIG as CONF_DEV } from '../config/dev';
export const environment = {
production: true,
CONFIG: { ...CONF_PROD, ...CONF_DEV }
};

environment.local.ts

import { APP_CONFIG as CONF_PROD } from '../config/production';
import { APP_CONFIG as CONF_LOCAL } from '../config/local';
export const environment = {
production: true,
CONFIG: { ...CONF_PROD, ...CONF_LOCAL }
};

接下来,在我的app.module.ts

ServiceWorkerModule.register('/ngsw-worker.js', { enabled: environment.production && environment.CONFIG.serviceWorker.enabled })

因此,只有在满足两个条件时才能启用服务工作线程:a)它是一个生产构建(environment.production: true,不要与我构建的环境混淆)和b)我实际上希望在该环境中启用服务工作线程(CONFIG.serviceWorker.enabled)。

当然,在我的.angular-cli.json中,我声明了它们:

"environments": {
"dev": "environments/environment.ts",
"local": "environments/environment.local.ts",
"test": "environments/environment.test.ts",
"prod": "environments/environment.prod.ts"
}

如果我ng build --prod --env=local,我仍然在我的应用程序中启用了 ServiceWorker ,尽管我在config/local.ts中将其设置为 false,这会覆盖config/production.ts中的"serviceWorker"对象。

事实上,即使我在 ALL 配置中设置了serviceWorker: { enabled: false },无论我在构建时使用--env标志设置什么环境,我总是启用 ServiceWorker 。

此外,如果我在运行时检查其他environment.CONFIG属性(如environment.CONFIG.apiEndpointenvironment.CONFIG.cookieDomain),它们就是我所期望的,基于我在构建时使用--env标志指定的环境。 我不知道我在这里错过了什么?如果 CLI 根据--env标志在构建时选择正确的环境文件,为什么正确合并的environment.CONFIG对象在构建时不存在? 如果我直接在我的环境文件中移动 serviceWorker 配置属性,它可以工作。但关键是要把它与其余的配置属性放在我的配置文件中,这些文件被合并到环境文件中。

此设置的要点是,应用可能有很多配置属性,但只有少数属性可能因环境而异。我不想将它们全部写入每个环境文件中。

因此,让生产配置包含所有属性是有意义的,然后在每个其他环境(开发/本地、测试)的配置中,只有与生产环境不同的属性,因此它们可以合并,因此当前环境属性将由生产配置组成,一些配置属性被当前环境的配置覆盖。

这里提供了一个解决方案,https://github.com/angular/angular-cli/issues/12190

环境.base.ts

export const environment = {
production: false,
foo: "bar"
}

环境.ts

import { environment as base } from "./environment.base";
export const environment = {
...base,
}

环境产品

import { environment as base } from "./environment.base";
export const environment = {
...base,
production: true
}

最新更新