Santos의 개발블로그

dotenv 본문

NPM/Valuable

dotenv

Santos 2020. 7. 26. 22:52

* 이 글은 https://www.npmjs.com/package/dotenv 번역하였습니다. 

 

Dotenv는 .env file로부터 process.env 환경변수를 로드하는 의존성이 없는 모듈입니다. 보관중인 환경 변수들을 12가지 요소 방법론을 기초로 한 코드로 부터 분리됩니다.

#1: Install

# with npm 
npm install dotenv

# or with Yarn 
yarn add dotenv

#2: Usage

가장 빠르게 사용할 수 있는 방법은 다음과 같습니다.

require('dotenv').config()

다음 .env 파일을 프로젝트의 root 디렉토리에 만들고, 구체적인 환경 변수들을 아래와 같이 새로운 라인에 추가합니다. 

DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

process.env는 .env 파일에 정의된 key들과 값들을 갖게 되었습니다. 

const db = require('db')
db.connect({  
	host: process.env.DB_HOST,  
    username: process.env.DB_USER,  
    password: process.env.DB_PASS
 })

#3: Preload

--require(-r) 을 command line option으로 사용하여 preload를 할 수 있습니다. 이를 사용하게 되면 따로 require 과 load 코드를 작성하지 않아도 됩니다. preload의 선호하는 접근법은 require 보다는 import를 사용할 때 입니다.

$ node -r dotenv/config your_script.js

설정 옵션은 dotenv_config_<option>=value 형식은 command line 속성 값으로 추가될 수 있습니다. 

$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/your/env/vars

설정 옵션을 셋팅한 환경변수를 사용할 수 있습니다. command line 속성들은 먼저 실행됩니다.

$ DOTENV_CONFIG_<OPTION>=value node -r dotenv/config your_script.js
$ DOTENV_CONFIG_ENCODING=latin1 node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env

#4: Config

config는 .env파일을 읽고 contents를 파싱하고 process.env에 할당한 다음, loaded된 contents 또는 실패했을 경우 error 키를 포함한 키가 속해있는 파싱된 객체를 반환합니다.

const result = dotenv.config()
 
if (result.error) {
  throw result.error
}
 
console.log(result.parsed)

또한 config에 옵션도 추가할 수 있습니다.

 

@ 4-1 Options

Path

* Default: path.resolve(process.cwd(), '.env')

환경변수를 포함한 파일이 있다면, Custom path를 지정할 수 있습니다.

require('dotenv').config({ path: '/full/custom/path/to/your/env/vars' })
Encoding

* Default: utf8

환경변수를 포함한 파일의 인코딩을 지정할 수 있습니다. 

require('dotenv').config({ encoding: 'latin1' })
Debug

Default: false

선언한 키 또는 값들이 셋팅이 잘 되었는 지, 디버그를 할 수 있습니다. 

require('dotenv').config({ debug: process.env.DEBUG })

#5: Parse

환경변수를 포함한 파일을 파싱 하는 엔진들을 String 또는 Buffer 또한 수용하고, 파싱된 키와 값을 포함한 객체를 반환합니다. 

const dotenv = require('dotenv')
const buf = Buffer.from('BASIC=basic')
const config = dotenv.parse(buf) // will return an object
console.log(typeof config, config) // object { BASIC : 'basic' }

@ 5-1 Options

Debug

Default: false

선언한 키 또는 값들이 셋팅이 잘 되었는 지, 디버그를 할 수 있습니다.

const dotenv = require('dotenv')
const buf = Buffer.from('hello world')
const opt = { debug: true }
const config = dotenv.parse(buf, opt)
// expect a debug message because the buffer is not in KEY=VAL form
Rules

파싱엔진은 아래 방법으로 지원합니다.

1. .env 파일에 선언한 BASIC=basic 은 { BASIC=basic } 이 된다. 

2. 비어있는 Line들은 무시한다. 

3. #으로 시작된 라인들은 comments로 취급합니다.

4. 비어있는 값은 비어있는 String이 됩니다.

(EMPTY='' becomes {EMPTY: ''})

5. 내부 인용문들은 JSON으로 취급합니다. 

(JSON={"foo": "bar"} becomes {JSON:"{\"foo\": \"bar\"}")

6. WhiteSpace는 제거됩니다.  

(FOO= some value becomes {FOO: 'some value'})

7. 따옴표는 쌍따옴표 치환됩니다.

(SINGLE_QUOTE='quoted' becomes {SINGLE_QUOTE: "quoted"})

8. 따옴표, 쌍따옴표로 선언된 값들의 WhiteSpace들은 유지됩니다.

(FOO=" some value " becomes {FOO: ' some value '})

#6: FAQ

Q. .env 파일을 git commit 해도 될까요?

A. .env 파일을 version control에 commit하는 행위는 절대로 해서는 안됩니다. DataBase 비밀번호, API 키 등 특정 환경 변수가 포함된 파일은 더더욱 commit을 해서는 안됩니다. 

 

Q. 다수의 .env 파일을 만들어도 될까요?

A. 다수의 .env 파일을 만드는 행위는 절대로 해서는 안됩니다.  배포를 할 때 설정들은 다르고, 환경들 사이에서 파일에 정의된 값들은 서로 공유되면 안되기 때문입니다. 

 

Q. 환경변수를 만들 때, .env 파일내에 이미 선언된 환경변수가 있다면 무슨일이 일어나나요?

A. 이미 선언된 환경변수는 수정이 불가능하며, 선언된 환경변수와 충돌이 난 다음 새로 만들어진 환경변수는 override되어 무시됩니다. 

 

Q. 환경변수를 만들 때, .env 파일내에 이미 선언된 환경변수가 있다면 무슨일이 일어나나요?

A. 이미 선언된 환경변수는 수정이 불가능하며, 선언된 환경변수와 충돌이 난 다음 새로 만들어진 환경변수는 무시됩니다. 좋은 방법은 아니지만, override하여 이러한 상황을 모면할 수는 있습니다. 

const fs = require('fs')
const dotenv = require('dotenv')
const envConfig = dotenv.parse(fs.readFileSync('.env.override'))
for (const k in envConfig) {
  process.env[k] = envConfig[k]
}

 

Q. plugin을 사용하여 dotenv를 customize할 수 있나요?

A.  dotenv-expand를 사용하여 cutomize 해보세요. 

const dotenv = require('dotenv')
const variableExpansion = require('dotenv-expand')
const myEnv = dotenv.config()
variableExpansion(myEnv)

< 참고자료 >

 

[사이트] #NPM

https://www.npmjs.com/package/dotenv

 

<Library> dotenv end

'NPM > Valuable' 카테고리의 다른 글

Axios 뜯어보기  (2) 2023.11.30
Recoil  (0) 2023.11.04
cookie  (0) 2020.12.26
cookie-parser  (0) 2020.08.01
axios  (0) 2020.07.26
Comments