본문 바로가기
C.W.K.
Stream
Lesson 07 of 10 · published

direnv: 디렉터리별 환경

~10 min · direnv, envrc, project

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

디렉터리 경계에서 환경을 적용해

direnv는 디렉터리에 들어갈 때 승인한 .envrc를 셸 코드로 평가하고, 나갈 때 그 파일이 만든 환경 차이를 되돌려. 프로젝트가 선택한 런타임 관리자와 비밀이 아닌 설정을 연결하기에는 편하지만, 의존성 관리자나 비밀 저장소가 아니며 외부 부수 효과를 되돌려 주지도 않아.

셸 훅을 설치해

brew install direnv
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
exec zsh
direnv status

훅은 디렉터리가 바뀔 때마다 환경을 다시 계산해. direnv status로 현재 셸이 어느 파일과 승인 상태를 보고 있는지 확인해.

내용을 읽은 뒤 허용해

cat .envrc
git diff -- .envrc .gitignore
direnv allow

allow는 알림을 닫는 버튼이 아니라, 검토한 셸 코드를 실행해도 된다는 승인이야. 브랜치를 바꾸거나 원격 변경을 받은 뒤, 또는 파일을 고친 뒤에는 diff를 다시 읽어. PATH_add 한 줄만 달라져도 이후 모든 명령이 고르는 실행 파일이 바뀔 수 있어.

연결 계약을 분명하게 남겨

PATH_add ./bin
source_env_if_exists .envrc.local
use mise
export APP_ENV=development

공유 .envrc에는 검토한 비밀 아닌 프로젝트 설정을 둘 수 있어. 토큰과 비밀번호는 자격 증명 저장소나 git에서 제외하고 권한을 제한한 .envrc.local 같은 로컬 파일에 둬. 공유 계약은 커밋하고 로컬 비밀 파일은 무시해. 팀이 .envrc 전체를 로컬 전용으로 쓰기로 했다면 그 파일을 무시하고, 실제 비밀 대신 변수 이름과 검증 방법만 담은 .envrc.example을 커밋해.

되돌릴 수 있는 범위를 알아둬

direnv는 디렉터리를 나갈 때 셸 변수를 복원할 수 있어. 하지만 평가 중 만든 파일, 시작한 프로세스, 실행한 배포와 원격 상태 변경은 취소하지 못해. .envrc는 빠르고 반복 가능한 환경 설정에 집중하고, 상태를 바꾸는 작업은 별도 명령으로 분리해.

승인은 계속되는 검토 계약이야

허용한 뒤에도 direnv status, type -a, printenv로 실제 결과를 확인해. 필요 없어진 승인은 direnv deny로 거두고, 바뀐 내용을 다시 허용하기 전에는 새 diff를 검토해. 익숙한 저장소라는 사실이 새 변경에 대한 승인은 아니야.

Code

프로젝트 .envrc 만들기·bash
cd ~/projects/myapp
cat > .envrc <<'EOF'
export DATABASE_URL=postgres://localhost/myapp
PATH_add bin
layout python3
EOF
direnv allow
which python3   # 현재 가상 환경 안의 경로여야 함

External links

Exercise

시험 디렉터리에 export FOO=bar를 담은 .envrc를 만들고 diff를 읽은 뒤 direnv allow를 실행해. 디렉터리를 나갔다 들어오며 값이 적용되고 해제되는지 보고, 파일을 고쳤을 때 다시 승인이 필요한지도 확인해. 마지막에는 direnv deny로 승인을 거둔 뒤 원래 환경이 돌아왔는지 검증해. 프로젝트가 비밀 없는 .envrc와 제외된 .envrc.local을 쓸지, 아니면 .envrc를 제외하고 .envrc.example을 커밋할지도 문서에 남겨.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.