빌드노트
--env-file을 바꿨는데 Node는 이전 환경값을 읽는다
Node 내장 --env-file은 이미 주어진 환경값을 덮지 않는다. 키 존재 확인에서 시작 설정의 수정 위치로 이어 가고, 같은 합성 키와 두 파일의 순서를 바꾼 새 프로세스의 실제 값으로 판단한다.
Node를 --env-file 옵션으로 다시 시작했는데도 파일의 새 값 대신 이전 값이 나온다면, 시작 환경에 같은 이름의 변수가 있는지 먼저 확인한다. Node 내장 --env-file은 이미 주어진 환경값을 덮지 않는다. 파일을 여러 개 지정해도 기존 환경값이 우선한다.
파일을 고치기 전에 시작 설정을 확인한다
앱을 시작하는 셸에서 앱과 같은 Node 실행 파일로 키의 존재 여부만 확인한다. 아래 BLOG_ENV_PROBE는 합성 키이므로, 자기 설정을 조사할 때는 따옴표 안의 이름을 해당 키로 바꾼다. --env-file을 붙이지 않아 파일을 읽기 전 상태를 보며, 값은 출력하지 않는다.
node -p "Object.hasOwn(process.env, 'BLOG_ENV_PROBE')"
키를 주지 않은 새 Node는 false, BLOG_ENV_PROBE=from-launcher를 주고 시작한 새 Node는 true를 출력했다. 두 실행의 종료 코드는 0이었다. 자기 키에서 true가 나오면 파일을 다시 편집하기 전에 셸이나 앱 시작 설정의 같은 키를 찾는다. IDE나 서비스에서 앱을 시작한다면 그 실행 구성의 환경을 확인해야 한다. 일반 터미널에서 실행한 조회만으로 다른 실행 구성까지 판단할 수는 없다.
파일에서 값을 관리하려면 앱 시작 설정에서 같은 키를 제거하고 새 Node 프로세스를 시작한다. 시작 설정에서 계속 관리할 값이라면 그곳의 값을 바꾼다. 파일을 수정하거나 옵션 순서를 바꾸는 것만으로 이미 주어진 환경값을 교체할 수는 없다.
Node v22.23.2의 공식 CLI 문서 (새 탭에서 열림)도 기존 환경값이 파일보다 우선한다고 설명한다. 뒤에 지정한 파일이 덮는 대상은 앞선 파일의 값이다. 키가 없는 false 조건이라면 실제로 읽는 파일과 파일 순서를 확인할 차례다.
같은 키로 두 파일의 순서만 바꿔 본다
Windows 11, PowerShell 7.6.6, Node v22.23.2에서 다음 비교를 실행했다. 별도 패키지는 필요 없다. 직접 비교하려면 빈 폴더에 두 파일을 UTF-8로 저장한다. base.env에는 출처를 구별할 기본값을 넣는다.
BLOG_ENV_PROBE=from-base
override.env에는 같은 키에 다른 값을 넣는다.
BLOG_ENV_PROBE=from-override
비교 전용 PowerShell 7 콘솔에서 두 파일이 있는 폴더로 이동한다. node --version으로 사용할 버전을 확인한다. 아래 명령은 PowerShell 문법이다. $env: 변경은 현재 셸과 이후에 시작하는 자식 프로세스에 적용되며, 사용자·시스템의 영구 설정을 바꾸지 않는다. PowerShell 환경변수 문서 (새 탭에서 열림)
먼저 합성 키를 시작 환경에서 제거하고 파일 하나, 두 파일 정방향, 두 파일 역방향을 비교한다. 각 node 명령은 새 프로세스를 시작한다.
$env:BLOG_ENV_PROBE = $null
node --env-file=base.env -p "process.env.BLOG_ENV_PROBE"
node --env-file=base.env --env-file=override.env -p "process.env.BLOG_ENV_PROBE"
node --env-file=override.env --env-file=base.env -p "process.env.BLOG_ENV_PROBE"
실제 출력은 명령 순서대로 다음과 같았다. 세 실행 모두 종료 코드 0이었다.
from-base
from-override
from-base
기존 키가 없으면 파일의 값이 들어온다. 두 파일을 지정했을 때는 뒤쪽 파일의 값이 남았으므로, 이 조건에서는 파일 나열 순서로 최종 값을 고를 수 있다.
이제 같은 콘솔에서 시작 환경에 from-launcher를 넣고 동일한 세 명령을 실행한다. 파일 내용은 바꾸지 않는다.
$env:BLOG_ENV_PROBE = 'from-launcher'
node --env-file=base.env -p "process.env.BLOG_ENV_PROBE"
node --env-file=base.env --env-file=override.env -p "process.env.BLOG_ENV_PROBE"
node --env-file=override.env --env-file=base.env -p "process.env.BLOG_ENV_PROBE"
이번에는 모두 같은 값이 나왔고, 세 실행 모두 종료 코드 0이었다.
from-launcher
from-launcher
from-launcher
파일 순서를 뒤집어도 시작 환경의 값은 남았다. 이전 값이 보이면서 정상 종료할 수 있으므로, 그 증상만으로 파일 로딩 실패라고 판단하지 않는다. 비교가 끝나면 전용 콘솔을 닫는다.
오류가 나면 해당 명령 직후 PowerShell의 $LASTEXITCODE를 확인하고 버전·파일 이름·작업 폴더부터 살펴본다. 상대 경로는 Node의 현재 작업 폴더를 기준으로 읽는다. 공식 문서에 따르면 --env-file로 지정한 파일이 없으면 오류가 나며, 별도 실행에서도 없는 파일은 기존 키의 유무와 관계없이 종료 코드 9로 끝났다. 기존 환경값이 있다고 누락 파일 오류까지 무시되는 것은 아니다.
이 비교의 수정 지점은 두 가지다. 기존 키가 있으면 앱 시작 설정의 값을 유지·수정·제거할지 정한다. 기존 키가 없고 파일끼리 충돌한다면 뒤에 올 파일을 정한다. 같은 조건의 짧은 Node 조회는 맞는데 앱만 다른 값을 쓴다면, 이후 앱 코드나 별도 설정 로더가 값을 바꾸는지도 확인한다.
관찰 범위는 Node v22.23.2의 내장 --env-file로 시작한 새 프로세스다. 실제 앱 환경이나 비밀값은 출력하지 않았고, 실행에 필요한 고정 OS 설정과 합성 키만으로 비교했다. dotenv 패키지, 다른 Node 버전, 이미 실행 중인 앱의 설정 갱신, 기존 빈 문자열과 한 파일 안의 중복 키는 검증하지 않았다.