多环境配置
配置是我们常用的功能,而且在不同的环境,经常会使用不同的配置信息。
本篇我们来介绍 Midway 如何加载不同环境的业务配置。
全局容器配置和业务配置的区别
src/configuration.ts
文件用于配置依赖注入容器的行为,是整个 Midway 最重要的文件。其中的 @Configuration
装饰器能控制整个 Midway 依赖注入容器的加载行为,例如组件加载,全局生命周期调整等能力。
依赖注入容器包含多个服务,ConfigService
是依赖注入容器的其中一个默认服务,用于加载业务配置。我们可以通过在 @configuration
装饰器中配置这个服务的行为,来加载不同环境 ,自定义的业务配置文件。
业务配置只跟业务本身相关,和框架不耦合,文件数量不定,内容也是自定义的。
业务配置文件
框架提供了可扩展的配置功能,可以自动合并应用、框架、组件的配置,且可以根据环境维护不同的配置。
我们可以自定义目录,在其中放入多个环境的配置文件,如下列常见的目录结构,具体环境的概念请查看 运行环境。
➜ my_midway_app tree
.
├── src
│ ├── config
│ │ ├── config.default.ts
│ │ ├── config.prod.ts
│ │ ├── config.unittest.ts
│ │ └── config.local.ts
│ ├── interface.ts
│ └── service
├── test
├── package.json
└── tsconfig.json
config.default.ts
为默认的配置文件,所有环境都会加载这个配置文件,一般也会作为开发环境的默认配置文件。
配置不是必须项,请酌情添加自己需要的环境配置。
业务配置加载
然后我们可以在 src/configuration.ts
中配置这个文件(目录),框架就知道加载它了。
// src/configuration.ts
import { Configuration } from '@midwayjs/decorator';
import { join } from 'path';
@Configuration({
importConfigs: [join(__dirname, './config/')],
})
export class ContainerLifeCycle {}
1、目录或者文件查找加载
可以指定加载一个目录,目录里所有的 config.*.ts
都会被扫描加载。
importConfigs
这里只是指定需要加载的文件,实际运行时会自动选择当前的环境来找对应的文件后缀。
配置文件的规则为:
- 1、可以指定一个目录,推荐传统的
src/config
目录,也可以指定一个文件 - 2、文件指定无需 ts 后缀
- 3、配置文件 必须显式指定添加
示例:指定目录
// src/configuration.ts
import { Configuration } from '@midwayjs/decorator';
import { join } from 'path';
@Configuration({
importConfigs: [join(__dirname, './config/')],
})
export class ContainerLifeCycle {}
示例:指定特定文件
手动指定一批文件时,这个时候如果文件不存在,则会报错。
// src/configuration.ts
import { Configuration } from '@midwayjs/decorator';
import { join } from 'path';
@Configuration({
importConfigs: [
join(__dirname, './config/config.default'),
join(__dirname, './config/config.local'),
join(__dirname, './config/custom.local'), // 可以使用自定义的命名,只要中间部分带环境就行
],
})
export class ContainerLifeCycle {}
也可以使用项目外的配置,但是请使用绝对路径,以及 *.js
后缀。
比如目录结构如下(注意 customConfig.default.js
文件):
base-app
├── package.json
├── customConfig.default.js
└── src
├── configuration.ts
└── config
└── config.default.ts
// src/configuration.ts
import { Configuration } from '@midwayjs/decorator';
import { join } from 'path';
@Configuration({
importConfigs: [join(__dirname, './config/'), join(__dirname, '../customConfig.default')],
})
export class ContainerLifeCycle {}