env-sync
개요
.env 파일의 키(항목 이름)를 비교하고 동기화한다. 시크릿 값은 다루지 않고 키 이름만 취급한다.
사용 시점
- 여러 프로젝트/환경의
.env키 목록을 비교할 때 .env.example템플릿과 실제.env를 동기화할 때- 새 키 추가 후 템플릿 갱신 누락을 점검할 때
작업 절차
- 비교 대상 파일을 확인한다. 기본은
.env.example↔.env. 사용자가 지정하면 그 쌍을 쓴다. - 각 파일에서 키를 추출한다 (아래 명령).
- 누락·추가 키를 계산한다.
- 결과를 보고한다 (아래 출력 형식).
- 사용자가 요청한 경우에만 동기화를 적용한다. 누락 키를 대상 파일 끝에
KEY=형태(빈 값)로 추가한다.
키 추출
grep -E '^[[:space:]]*(export[[:space:]]+)?[A-Za-z_][A-Za-z0-9_]*=' .env | sed -E 's/^[[:space:]]*(export[[:space:]]+)?([A-Za-z_][A-Za-z0-9_]*)=.*/\2/' | sort -u
export KEY=...와 KEY=...를 모두 인식하고, 빈 줄과 # 주석 줄은 무시한다.
비교
comm -23 template.keys env.keys # 템플릿에만 있음 → .env 누락
comm -13 template.keys env.keys # .env에만 있음 → 템플릿 누락
동기화 (요청 시에만)
- 누락 키를 대상 파일 끝에
KEY=형태로 추가한다. - 기존 순서를 유지하고 중복을 만들지 않는다.
- 값을 복사하지 않는다. 템플릿에는 시크릿 값이 없어야 하므로 빈 값으로 둔다.
- 주석은 복사하지 않는다.
주의
KEY=(빈 값)도 정의된 키다.- 인라인 주석(
KEY=value # comment)의#는 값의 일부로 취급한다. 제거하지 않는다. - 키는
[A-Za-z_][A-Za-z0-9_]*패턴만 인식한다. 이 패턴에 안 맞는 특수 키는 수동으로 확인한다.
흔한 실수
| 실수 | 처리 |
|---|---|
| 값까지 복사함 | 시크릿 노출 위험 — 키만 복사하고 값은 비운다. |
| 주석 줄을 키로 인식함 | ^# 줄은 추출에서 제외한다. |
| 방향 혼동 | 누락·추가가 어느 파일 기준인지 보고에 명시한다. |
출력 형식
누락 (.env.example → .env): DB_PASSWORD
추가 (.env에만): EXTRA_KEY
동기화: .env에 DB_PASSWORD 빈 값 추가
