@nacyo_t님의 소개로 direnv를 쓴지도 꽤 되었다. 이런 류의 도구의 존재는 알고 있었지만, 그동안 여러 환경을 오가야 할 필요가 많이 없었기 때문에 굳이 써야 할 필요성을 못 느끼고 있었다가 지금 업무 환경에서는 개발환경의 버전이 다른 경우도 많고 Docker를 쓰다 보니 관련 환경변수를 전역이 아닌 프로젝트별로 설정해서 써야 하는 경우가 많았다. 프로젝트 수가 많다 보니 전역으로 관리할 수 있는 양이 아니어서 사용하기 시작한 뒤로 너무 편해서 계속 쓰고 있다.
direnv
direnv는 이름 그대로 폴더별로 환경을 관리해주는 도구이다. direnv로 설정을 해 놓으면 폴더 이동을 할 때마다 자동으로 설정해놓은 환경변수나 원하는 런타임 버전 지정 등을 알아서 할 수 있다. 그래서 한번 설정해 놓으면 해당 프로젝트에서 다른 설정에 대해서는 잊어버리고 쉽게 작업을 할 수 있고 어떤 환경 설정을 해놨는지가 궁금해지면 설정 파일을 열어보면 그만이다.
direnv 설치
direnv는 Go로 작성되었는데 홈페이지에 나온대로 각 OS의 패키지 매니저를 이용해서 설치하거나(macOS라면 brew install direnv
) 릴리스 페이지에서 OS에 맞는 바이너리를 받아서 설치해서 사용하면 된다.
설치 후에는 쉘에서 direnv가 실행되도록 해야 하므로 bash
를 쓰고 있다면 ~/.bashrc
파일에 eval "$(direnv hook bash)"
를 추가하면 폴더 이동을 할 때마다 자동으로 실행되게 된다. bash
외에 다른 쉘을 쓰고 있다면 zsh, fish, tcsh를 다 지원하므로 홈페이지를 참고해서 설정하면 된다.
.envrc
사용방법은 아주 간단한데 환경설정이 필요한 디렉터리 아래 .envrc
파일을 만들면 된다. 예를 들어 project-a
라는 디렉터리 아래 다음과 같이 .envrc
를 만들었다고 해보자.
$ cat .envrc
export HOST=127.0.0.1
export PASSWORD=asdf
이제 project-a
폴더에 진입하면 위 파일을 실행해서 자동으로 환경 변수를 설정해 주게 된다.
$ cd project-a
direnv: loading .envrc
direnv: export +HOST +PASSWORD
$ env | grep PASSWORD
PASSWORD=asdf
$ cd ..
direnv: unloading
폴더에 진입하자 direnv
가 실행되고 HOST
, PASSWORD
환경변수를 설정하고 폴더를 빠져나오자 자동으로 다시 제거하는 것을 볼 수 있다. 이렇게 필요한 환경만 잘 설정해 놓으면 이제 작업할 때 폴더만 이동하면서 환경 걱정 없이 작업할 수 있다.
$ echo 'export USERNAME=outsider' > .envrc
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
$ direnv allow
direnv: loading .envrc
direnv: export +USERNAME
위에서 보는 것처럼 새로운 .envrc
파일이나 기존의 .envrc
를 수정하는 경우에는 바로 적용되지 않고 direnv allow
를 해주어야 사용할 수 있다. 이는 압축파일을 다운받거나 다른 프로젝트 파일을 받았는데 거기에 .envrc
가 있어서 자동으로 실행되어 보안 문제가 발생하는 것을 막기 위함이다. 처음에는 어색했지만 한번 설정하면 자주 바꿀 일은 없으므로 크게 불편하지는 않다.
그리고 위에서 .envrc
파일의 내용에서 눈치챘겠지만 direnv는 환경 변수설정 전용이 아니다. .envrc
의 내용에 export USERNAME=outsider
처럼 써주었는데 이는 환경변수를 설정하는 bash 명령어 그대로이다. 이 말은 쉘 명령어는 .envrc
에서 사용할 수 있다는 의미라서 단순 환경변수 외에도 원하는 작업을 쉘로 작성해서 여기에 넣을 수 있다. 그래서 실제로 위키에도 언어별 환경을 설정하는 방법이 나와 있다. 프로젝트별로 Python이나 Ruby의 버전이 다른 경우에도 이 Project Layouts를 쓰면 자동으로 버전도 프로젝트에 맞게 설정해서 사용할 수 있다.
좋은팁입니다 ^^ 감사합니다.
네 방문해 주셔서 감사합니다.