Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

direnv 활용 가이드 – Linux에서 프로젝트별 환경 변수 자동 관리하기

direnv란 무엇인가?

direnv는 Linux와 macOS 같은 UNIX 운영체제의 셸을 위한 오픈소스 확장 도구입니다. 단일 정적 실행 파일로 컴파일되며 bash, zsh, tcsh, fish 등 다양한 셸을 지원합니다.

direnv의 핵심 목적은 프로젝트별 환경 변수를 관리하면서도 ~/.profile이나 기타 셸 시작 파일을 어지럽히지 않는 것입니다. 현재 디렉터리에 따라 환경 변수를 자동으로 로드하고 언로드하는 새로운 방식을 제공합니다.

direnv는 SaaS(Software-as-a-Service) 애플리케이션 구축 방법론인 12factor 앱의 환경 변수를 로드하거나, 프로젝트별로 격리된 개발 환경을 만들고, 배포용 시크릿(secret)을 불러오는 데 활용됩니다. 또한 rbenv, pyenv, phpenv와 유사한 멀티 버전 설치 및 관리 솔루션을 만드는 데도 사용할 수 있습니다.

direnv의 작동 원리

셸이 명령 프롬프트를 띄우기 전에 direnv는 현재 디렉터리(pwd 명령으로 확인 가능)와 상위 디렉터리에 .envrc 파일이 존재하는지 확인합니다. 이 검사 과정은 매우 빠르기 때문에 프롬프트가 뜰 때마다 실행되어도 성능 저하는 전혀 느껴지지 않습니다.

적절한 권한을 가진 .envrc 파일을 발견하면 bash 서브셸에서 해당 파일을 로드하고, 내보내기(export)된 모든 변수를 캡처해 현재 셸에서 사용할 수 있게 만듭니다.

Linux에 direnv 설치하기

대부분의 Linux 배포판에서는 시스템 패키지 관리자를 통해 기본 저장소에서 direnv 패키지를 간편하게 설치할 수 있습니다.

$ sudo apt install direnv		#Debian, Ubuntu, Mint
$ sudo dnf install direnv #Fedora

RHEL(Red Hat Enterprise Linux), CentOS 등 snap을 지원하는 배포판에서는 snap으로 설치할 수 있습니다. 이 경우 시스템에 snapd가 먼저 설치되어 있어야 합니다.

$ sudo snap install direnv

Bash 셸에 direnv 연결(hook)하기

direnv를 설치한 후에는 현재 사용 중인 Linux 셸에 연결해야 합니다. 예를 들어 Bash의 경우 ~/.bashrc 파일 끝에 다음 줄을 추가합니다.

rvm, git-prompt처럼 프롬프트를 조작하는 다른 셸 확장 기능보다도 뒤에 위치하도록 주의하세요.

eval "$(direnv hook bash)"

ZSH 셸의 경우

~/.zshrc 파일 끝에 다음 줄을 추가합니다:

eval "$(direnv hook zsh)"

FISH 셸의 경우

~/.config/fish/config.fish 파일 끝에 다음 줄을 추가합니다:

eval (direnv hook fish)

그다음 열려 있는 터미널 창을 닫고 새 셸을 열거나, 아래와 같이 설정 파일을 다시 불러옵니다(source).

$ source ~/.bashrc
$ source ~/.zshrc
$ source ~/.config/fish/config.fish

Linux 셸에서 direnv 사용하기

direnv의 작동 방식을 살펴보기 위해 tecmint_projects라는 새 디렉터리를 만들고 해당 디렉터리로 이동해 보겠습니다.

$ mkdir ~/tecmint_projects
$ cd tecmint_projects/

먼저 명령줄에서 TEST_VARIABLE이라는 새 변수를 만들어 보겠습니다. echo로 출력하면 값이 비어 있는 것을 확인할 수 있습니다:

$ echo $TEST_VARIABLE

이제 direnv가 로드할 Bash 코드가 담긴 새로운 .envrc 파일을 생성합니다. echo 명령과 출력 리디렉션 문자 (>)를 사용해 "export TEST_VARIABLE=tecmint"라는 내용을 추가합니다:

$ echo export TEST_VARIABLE=tecmint > .envrc

기본적으로 보안 메커니즘이 .envrc 파일의 로딩을 차단합니다. 파일이 안전하다는 것을 확인했으므로 다음 명령으로 내용을 승인해야 합니다:

$ direnv allow .

.envrc 파일의 로딩이 승인되었으니, 앞서 설정한 TEST_VARIABLE 값을 확인해 보겠습니다:

$ echo $TEST_VARIABLE

tecmint_projects 디렉터리를 벗어나면 direnv가 자동으로 언로드되므로, TEST_VARIABLE 값을 다시 확인하면 비어 있음을 알 수 있습니다:

$ cd ..
$ echo $TEST_VARIABLE
direnv 활용 가이드 – Linux에서 프로젝트별 환경 변수 자동 관리하기

반대로 tecmint_projects 디렉터리에 진입할 때마다 아래 스크린샷과 같이 .envrc 파일이 자동으로 로드됩니다:

$ cd tecmint_projects/
direnv 활용 가이드 – Linux에서 프로젝트별 환경 변수 자동 관리하기

특정 .envrc의 승인을 철회하려면 deny 명령을 사용합니다.

$ direnv deny .			#현재 디렉터리
또는
$ direnv deny /path/to/.envrc

더 자세한 정보와 사용법은 direnv 매뉴얼 페이지를 참고하세요:

$ man direnv

또한 direnvstdlib(direnv-stdlib)을 함께 제공하며, 여기에는 새 디렉터리를 PATH에 손쉽게 추가하는 등 다양한 작업을 도와주는 여러 함수가 포함되어 있습니다.

사용 가능한 모든 함수의 문서는 direnv-stdlib 매뉴얼 페이지에서 확인할 수 있습니다:

$ man direnv-stdlib

지금까지 direnv의 개념부터 설치, 셸 연결, 그리고 실전 활용법까지 살펴보았습니다. 궁금한 점이나 의견이 있다면 아래 피드백 폼을 통해 공유해 주세요!