rbenv 작동원리

rbenv 제대로 사용하기

이 글은 로컬 시스템에 rbenv이 이미 설치되어 있는 것을 전제로 작성하였다.


루비 버전별로 실행환경을 관리하는 툴로는 rvm, rbenv, chruby 등을 손꼽을 수 있다.
rvm이 가장 오래된 관리자이지만, 레일스 분야에서는 rbenv을 더 선호하는 경향이 있다. 실제로 rvm보다 더 가볍다. 어떤 사람은 이 둘의 관계를 마치 sinatra와 rails에 비유하여 설명하기도 한다.

지금까지 공개된 루비 버전 목록을 살펴 보는 것도 의미 있는 일일 것이다.

이와 같이 루비는 지속적으로 버전업이 되고 있으며, 현재 공개된 가장 최신 버전은 2.2.3, 곧 이어 2.3 버전이 출시를 앞두고 있다.

루비 Gem은 이와 같이 루비 버전과 밀접한 관계가 있고, 레일스 프로젝트 개발시 사용한 루비 버전과 Gem 버전은 항상 일정하게 유지되어야 할 필요가 있는 것이다.

레일스에서는 이와 같은 상황을 해결하기 위해 bundler이라는 젬을 사용하여 Gem 목록을 관리/유지하게 된다.

한편 rbenv은 ~/.rbenv/shims라는 디렉토리를 생성하며, rbenv이 제대로 동작하기 위해서는 PATH의 제일 처음에 이 경로를 추가해 주어야 한다. 이렇게 하므로써 터미널에서 실행되는 명령이 rbenv의 관리하에 있는 루비 명령일 경우 rbenv으로 넘겨주게 된다. 이 때 rbenv은 특정 루비 버전의 명령을 실행하게 되는 것이다.

그렇다면 rbenv이 루비 버전은 어떻게 알아챌까. 아래의 순서대로 루비 버전을 찾게 된다.

  1. RBENV_VERSION 환경변수가 지정된 경우에는 이 값을 루비 버전으로 인식하게 된다. 이 값은 rbenv shell 2.x.x 명령으로 지정할 수 있다.
  2. 실행하고자 하는 스크립트 파일의 위치하는 현재 디렉토리와 상위 디렉토리의 계층구조를 따라 가면서 찾게 되는 .ruby-version 파일의 버전을 인식하게 된다. 이 과정은 루트 디렉토리까지 진행된다. .ruby-version 파일은 실제로 rbenv local 2.x.x 명령으로 지정할 수 있다.
  3. 마지막으로 전역 버전 파일인 ~/.rbenv/version 파일을 참조하여 루비 버전을 인식하게 된다. 이 파일은 rbenv global 2.x.x 명령을 실행하여 생성하게 된다.

용어정리 : shim이라는 단어의 뜻은 틈새를 메우는 쐐기라는 의미를 가진다. 아마도 shims 실행명령들이 실제로 현재 버전의 루비 명령들을 실행하도록 연결한다는 맥락에서 이러한 단어를 사용한 듯하다.(개인적인 추론)

그렇다면 이와 같이 ~/rbenv/shims 디렉토리에 루비 명령 파일을 생성하는 작업은 언제 발생할까. rehashing이라는 과정을 거쳐서 이러한 작업이 수행되는데, 아래와 같은 명령을 실행하면 된다.

$ rbenv rehash

이 명령의 실행결과로 ~/.rbenv/versions/[version]/bin 디렉토리에 있는 파일들이 ~/.rbenv/shims 디렉토리에 복사(?)된다.

그러나 실제로 ~/.rbenv/shims 디렉토리에 있는 실행파일들의 내용을 보면 모두가 동일한 쉡스크립트 코드를 가지고 있다.

#!/usr/bin/env bash
set -e
[ -n "$RBENV_DEBUG" ] && set -x

program="${0##*/}"
if [ "$program" = "ruby" ]; then
for arg; do
case "$arg" in
-e* | -- ) break ;;
*/* )
if [ -f "$arg" ]; then
export RBENV_DIR="${arg%/*}"
break
fi
;;
esac
done
fi

export RBENV_ROOT="/Users/[user-name]/.rbenv"
exec "/usr/local/Cellar/rbenv/0.4.0/libexec/rbenv" exec "$program" "$@"

결국 rehashing 과정을 통해 ~/.rbenv/versions/[version]/bin 디렉토리의 각 파일명과 동일한 쉡스크립트 파일을 ~/.rbenv/shims 디렉토리에 생성하게 된다는 것으로 이해가 된다.

부연해서 설명하자면, 루비 버전을 변경하거나(예, rbenv global|local|shell 2.2.x) 새로운 젬을 추가(예, gem install rails)한 후에는 rbenv rehash 명령을 추가하여 현재의 루비버전의 실행파일들(~/.rbenv/versions/[current-version]/bin/)의 이름과 동일한 쉡스크립트 파일들을 ~/.rbenv/shims 디렉토리에 생성한다는 말이다.

참고 : rbenv rehashは何をやっているのか?()

rbenv init

rbenv이 동작하기 위해서는 초기화 작업이 이루어져야 한다. rbenv init – 명령을 통해서 이러한 과정이 진행된다.

$ rbenv init -
export PATH="/Users/hyo/.rbenv/shims:${PATH}"
source "/usr/local/Cellar/rbenv/0.4.0/libexec/../completions/rbenv.zsh"
rbenv rehash 2>/dev/null
rbenv() {
typeset command
command="$1"
if [ "$#" -gt 0 ]; then
shift
fi

case "$command" in
rehash|shell)
eval `rbenv "sh-$command" "$@"`;;
*)
command rbenv "$command" "$@";;
esac
}
  • 가장 먼저 기존 경로의 앞에 `~/.rbenv/shims` 경로를 추가한다. 이로서 `rbenv`이 제대로 동작하게 된다.(2번 코드라인)
  • 다음은 `rbenv` 명령의 자동완성 기능이 추가된다. (3번 코드라인)
  • 이어서 `rehashing` 작업이 실행된다. (4번 코드라인)
  • 마지막으로 `sh` 디스패쳐를 인스톨한다. (5번 코드라인)

루비 버전 설치

설치가능한 루비 버전을 알고 싶을 경우에는 아래와 같이 명령을 실행한다.

$ rbenv install -l

이 목록에서 하나를 선택해서 아래와 같이 설치한다. (여기서는 2.2.3 버전을 설치하기로 한다)

$ rbenv install 2.2.3

이렇게 설치된 루비 버전을 실제로 ~/.rbenv/versions 디렉토리에 위치하게 된다.

또한 이 버전을 시스템 전체에 결처 반영되도록 하기 위해서는,

$ rbenv global 2.2.3

와 같이 지정한다. 그 결과를 아래와 같이 확인해 볼 수 있다.

$ rbenv version
2.2.3 (set by /Users/[user-name]/.rbenv/version)

만약 특정 디렉토리에서만 다른 버전을 사용하고 싶은 경우에는 아래와 같이 local 옵션을 지정하면 된다.

$ mkdir test-rbenv
$ cd test-rbenv
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]
$ rbenv local 2.2.2

그리고 확인작업을 위해서 아래와 같이 명령을 실행해 본다.

$ rbenv version
2.2.2 (set by /Users/hyo/test-rbenv/.ruby-version)

실제로 test-rbenv 디렉토리에 .ruby-version이라는 파일이 생성되었고 2.2.2라는 문자열를 가지는 텍스트파일임을 알 수 있다.

추가로 터미널의 한 세션에서만 다른 루비 버전을 지정하고자 할 때는,

$ rbenv shell 2.2.1

와 같이 지정한다. 그리고 확인을 위해서 다음과 같이 명령을 실행해 본다.

$ rbenv version
2.2.1 (set by RBENV_VERSION environment variable)

터미널의 현재 쉘 세션에서만 사용하도록 지정할 경우에는 루비버전이 RBENV_VERSION 환경변수에 저장된다는 것을 알 수 있다. 현재 쉘 세션을 종료하게 되면 쉘 버전도 사라지게 된다.

루비 버전의 삭제

불필요한 루비 버전을 삭제하고자 할 경우에는 ~/.rbenv/versions 디렉토리에서 대상 버전명의 디렉토리를 삭제하면 된다. 2.2.1 버전을 삭제할 경우에 아래와 같이 할 수 있다.

$ rbenv prefix 2.2.1
/Users/[user-name]/.rbenv/versions/2.2.1
$ rm -rf /Users/[user-name]/.rbenv/versions/2.2.1

부록

글쓴이: 최효성

외과전문의,웹프로그래밍,컴퓨터 일러스트레이션 / Surgeon, Medical Illustration, Web Programmer

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중