我正在尝试在环境文件中导入/合并单独的配置文件,以提供具有当前环境的所有正确属性的进一步全局 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.apiEndpoint
或environment.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
}