다중 런타임 버전 매니저 asdf

SungMoon, Yoon·2024년 3월 3일
post-thumbnail

한가지 언어와 버전만 다루는 개발자는 없을 것이다. 오픈 소스 생태계가 눈부신 발전은 사용자들의 뜨거운 논의와 피드백을 통해 프로그래밍 언어의 안정성과 기능의 발전을 가속한다. 당신을 오랫동안 괴롭혔던 문제가 해결되었다는 업데이트 로그를 보았다면, 당장 새 버전을 도입하여 여러 이점을 누리고 싶을 것이다. 그러나 현업에서는 가장 최근의 버전을 빠르게 도입하기보다 내 코드가 안정적으로 작동하는 버전을 오래 사용하길 원하는 관성이 작용한다. 이윤을 추구하는 기업의 입장에서는 구버전을 새 버전으로 마이그레이션 하는 데에 쓰이는 인풋 대비 얻을 수 있는 아웃풋이 크지 않다면 그 선택을 망설이게 되는 것이다.

기업과 마찬가지로 개발자들에게도 관성의 법칙은 똑같이 적용된다. 소위 개발자들은 실제 로직을 구현하는 것만큼 개발 환경을 세팅하는 것에 시간과 노력이 투자된다고 생각한다. 사실 이 문제는 전통적으로 개발자들이 많이 겪는 문제기 때문에 다양한 솔루션이 등장했다. 이 문제와 꼭 맞는 솔루션은 아니지만 Oracle의 VM VirtualBox, VMWare등의 가상화 컴퓨팅 소프트웨어가 먼저 등장 하기도 했다. 내가 가장 자주 이용하는 파이썬 진영에서도 이 문제를 해결하기 위해 수많은 툴이 나왔다. 나는 Python, Node를 즐겨 사용하는데, 각각 virtualenv, pyenv, conda와 nvm을 즐겨 사용했었다.

이 것만로도 부족함은 없지만 언어마다 사용 방법을 익혀야 하고, 프로젝트별로 환경을 활성화/비활성화 하는 등 불편함이 많아 불편함을 감수해야했다. 또한 개발자의 로컬 머신에서 환경을 관리하기 때문에 소스 코드를 체크인하고 팀원과 공유하더라도 같은 버전을 사용하려면 상호 간의 확인 절차가 필요하기도 하다.

오늘 소개할 asdf는 이러한 문제를 해결 해주는 버전 관리 툴이다. 하나의 파일을 작성하여 체크인하면 팀원들과 정확히 동일한 도구의 버전을 사용할 수 있다.

간단히 linux 환경에서 asdf & direnv 패키지를 설치하고, 소스코드를 관리하는 예제를 따라 해보자.

Install Dependencies

> apt update -y
> apt install curl git

Download asdf

> git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

Install adsf

> . "$HOME/.asdf/asdf.sh"
> . "$HOME/.asdf/completions/asdf.bash"

설치는 모두 마쳤다. adsf는 Plugin이라는 컨셉으로 각 언어의 버전을 관리한다. Node.js, Ruby 언어에 대한 버전관리를 시작하고 싶으면 Node.js Plugin과 Ruby Plugin을 설치하는 방식이다. First Party plugin으로 Elixir, Erlang, Node.js, Ruby를 제공하고 있다. 누구나 플러그인을 제작할 수 있기 때문에 커뮤니티 플러그인을 사용할 수 있다.

또한 관련 프로젝트인 direnv를 플러그인으로 함께 사용하면 프로젝트 폴더에 진입할 때 자동으로 환경을 교체해준다. 강력 추천.

> asdf plugin-add direnv
> asdf direnv setup --shell bash --version latest

예시로, Node.js 플러그인과 Python 플러그인을 설치해보자

Add Node.js Plugin

> asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
> asdf plugin add python https://github.com/asdf-community/asdf-python
> asdf plugin list
nodejs
python

Install a Version

이제 Node.js 16.5.0을 설치해보자, 간결한 명령어로 쉽게 원하는 버전을 설치할 수 있다.

asdf install nodejs 16.5.0

Usage with direnv

프로젝트를 하나 만들고, .tool-versions 설정 파일에 특정 버전의 Node.js 와 Python 환경을 정의해보자

// .tool-versions
nodejs 16.5.0
direnv 2.34.0

이제 프로젝트 경로에 도달하면 direnv 사용 허가를 요청하는 메세지가 뜬다.

root@7d0780d07b37:~# cd asdf-example/
direnv: error /root/asdf-example/.envrc is blocked. Run `direnv allow` to approve its content

이제 direnv allow 명령어만 치면, 다음에 프로젝트 폴더에 진입 시 자동으로 .tool-version에 정의한 환경으로 변경된다.

결론

여기까지 asdf에 대해 알아봤다. 프로젝트 이름은 ‘asdf’ 부터 개발자가 매전 커맨드를 통해 환경을 제어하는 귀찮음을 해소해 주겠다는 강한 의지가 보이는 만큼, 여러 언어에 대한 버전을 관리한다는 점과 direnv와의 궁합이 잘 맞는다는 점에서 성공한 프로젝트라고 평가하고 싶다.

다만 나는 asdf를 요새 적극적으로 사용하지는 않는데, 그 이유는 특정 Python 패키지의 경우 c로 빌드된 라이브러리 의존성을 요구하는 경우가 있기 때문이다. 이런 경우 차라리 docker를 통해 팀원들과 공통의 개발 환경을 구성한다. 또한 한 프로젝트 경로에서 다양한 환경(개발/프로덕션/테스트)를 구분하는 것이 더 수월하기 때문이다.

0개의 댓글