1. (사전 요구 사항) 패키지 설치
$ yarn add @nestjs/config
$ yarn add js-yaml
$ yarn add @types/js-yaml --dev
$ yarn add cpx # 파일 copy 도구
# cpx가 사용이 꺼려지면 아래처럼 직접 명령어 파이프라인을 작성해도 괜찮다.
"scripts": {
"dev": "rm -rf dist/config/config.*.yaml && mkdir -p dist/config && cp config/config.local.yaml dist/config && cross-env ENV=local nest start --watch",
2. 설정 파일 작성
- config 설정 ./config/configuration.ts
- 설치한 js-yaml 패키지의 load 함수를 통해서 yaml 파일을 읽을 수 있다.
import { readFileSync } from 'fs';
import * as yaml from 'js-yaml';
import { join } from 'path';
const env = process.env.ENV || 'local';
const YAML_CONFIG_FILENAME = `config.${env}.yaml`;
export default () => {
return yaml.load(
readFileSync(join(__dirname, YAML_CONFIG_FILENAME), 'utf8'),
) as Record<string, any>;
};
3. 스크립트 작성
// dist 디렉토리에 yaml 파일 복사 명령
"copy-files": "cpx \\"config/*.yaml\\" dist/config/",
"prebuild": "rimraf dist",
"build": "yarn run copy-files && nest build",
"format": "prettier --write \\"src/**/*.ts\\" \\"test/**/*.ts\\"",
"start": "yarn run copy-files && nest start",
"start:dev": "yarn run copy-files && nest start --watch",
- nest-cli.json
- nest bulld 시 dist 디렉토리 삭제, 생성이 자동이다.
- 기껏 cpx를 사용해서 yaml 파일을 복사했는데 dist 디렉토리를 삭제하고 생성하며 파일이 사라지는 문제가 있었다.
- 아래 옵션을 false로 입력하고 "prebuild": "rimraf dist", 스크립트로 dist를 수동 삭제하자
"compilerOptions": {
"deleteOutDir": false
}
}
4. 프로젝트 적용
@Module({
imports: [
ConfigModule.forRoot({
load: [configuration],
isGlobal: true,
}),
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Reference