ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [nestjs] env파일로 관리하던 환경변수를 yaml파일로 관리하기
    Node.js/nest.js 2023. 7. 2. 01:31

    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",
    • 파일 복사를 위해 nest build의 assets이라는 설정도 있지만 config 폴더가 src 내부에 위치할때만 사용 가능하다고 한다. 우리는 config 폴더가 src 외부에 위치하기 때문에 cpx를 사용한다. (https://docs.nestjs.com/cli/monorepo#assets)

    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. 스크립트 작성

    • pakage.json
      • 빌드 script 수정
    // 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. 프로젝트 적용

    • AppModule
    @Module({
      imports: [
        ConfigModule.forRoot({
          load: [configuration],
          isGlobal: true,
        }),
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}
    

    Reference

    반응형
Designed by Tistory.