이 글에서는 Mac에서 Ruby를 위한 가장 인기 있는 버전 관리자인 Chruby, Rbenv, RVM을 비교할 것입니다. 또한 여러 언어를 위한 버전 관리자인 Asdf와 Rust로 작성된 새로운 버전 관리자인 Frum에 대해서도 다룰 것입니다. 여러분이 가장 필요로 할 만한 것에 기반하여 추천을 해드리겠습니다.
미리 설치된 Ruby는 개발자를 위한 것이 아닙니다
Ruby에 익숙하지 않은 분들은 macOS에 미리 설치된 Ruby를 발견하고 기뻐합니다. 그들은 더 경험 많은 개발자가 그들에게 “Mac 시스템 Ruby를 사용하지 마세요”라고 말할 때 종종 실망합니다. 저는 다른 곳에서 그 이유에 대해 작성했습니다. 간단히 말해, 시스템 Ruby는 macOS를 위한 것이지 여러분을 위한 것이 아닙니다. 유틸리티 스크립트를 실행하기에는 괜찮지만, 개발을 위해서는 시스템 Ruby는 최신이 아니며, 조심하지 않으면 소프트웨어 패키지를 설치하는 것이 두통을 유발할 수 있습니다(시스템 보안 위반 포함).
Homebrew의 한 가지 Ruby 문제
Homebrew는 macOS에 개발자용 소프트웨어를 추가하기 위한 패키지 관리자로 거의 표준이 되었습니다. Homebrew는 시스템 Ruby에 의존하지 않고 새로운 Ruby 버전을 설치하기 쉽게 만듭니다. 하지만 Homebrew에는 두 가지 문제가 있습니다. 첫째, 다른 Homebrew 패키지를 설치할 때 Homebrew의 Ruby 버전이 자동으로 더 최신 버전으로 대체될 수 있습니다(이 문제는 brew pin ruby
로 해결됨). 더 중요한 것은, Homebrew은 하나의 Ruby 버전만 설치할 수 있다는 것입니다. Ruby로 하나 이상의 프로젝트를 개발하거나 유지 관리하고 있다면 Ruby 버전을 전환해야 할 가능성이 높습니다. 그것이 바로 버전 관리자가 필요한 이유입니다.
Asdf for Multiple Languages
Asdf는 다양한 언어를 지원하는 버전 관리자입니다. Ruby를 사용하여 Rails 6로 웹 애플리케이션을 개발하고 있다면, Rails 스타터 애플리케이션을 구축하기 위해 Node와 Yarn을 설치해야 합니다. (Rails 7은 Node의 필요성을 제거할 수도 있지만, 아직 확실하지 않습니다.)
따라서, Rails 개발자에게 Asdf는 이상적인 버전 관리자입니다. 파이썬, Elixir 또는 다른 많은 언어로 애플리케이션을 개발하는 경우에도 적합합니다 (지원되는 언어 목록은 여기를 참조). Asdf를 사용하는 단점이 있을까요? 두 가지입니다. 일반적인 명령어를 가로채기 위해 shim을 사용하므로 문제 해결이 어려울 수 있습니다. 또한, 일부 작업에 대해 약간 느릴 수 있습니다. 다양한 언어로 개발하고 있다면 Asdf를 사용해 보시고 만족하십니까. Asdf가 느리다고 느낀다면 Rust로 작성된 Ruby 전용 버전 관리자인 Frum으로 전환하세요.
Ruby 전용 버전 관리자
Ruby만을 사용하여 애플리케이션을 개발할 계획이라면, Chruby, Frum, Rbenv, RVM 중 하나를 선택하세요. 이 네 가지 중 차이점은 속도, 복잡성 및 각각의 Ruby 버전 전환 방식에 있습니다. 가장 오래된 것부터 살펴보죠: RVM.
RVM
RVM은 루비를 위한 첫 번째 인기 있는 버전 관리자였습니다. 여전히 유지 관리되고 널리 사용되고 있습니다. RVM은 디렉토리를 변경할 때 환경 변수를 설정하도록 시스템 cd
명령을 수정합니다. cd
명령을 재정의하기 위해 RVM 설치 스크립트는 쉘 구성 파일(최신 Mac의 ~/.zshrc
파일)을 변경합니다.
RVM은 루비와 자료 버전 및 위치를 표시하여 환경 변수를 제대로 표시합니다. 이는 문제를 진단하는 데 도움이 될 수 있습니다. 그러나 RVM은 자료 세트와 같은 추가 기능을 포함합니다. 자료 세트는 이제 더 이상 필요하지 않으며, Bundler가 자료 의존성을 관리하기 위해 핵심 루비에 추가되었습니다. 추가적인 복잡성은 필요하지 않으므로 많은 개발자들은 Rbenv, Chruby 또는 Frum과 같은 더 새로운 버전 관리자로 전환했습니다.
Rbenv
RVM과 함께 Rbenv은 오랫동안 루비를 위한 가장 인기 있는 버전 관리자였습니다. Rbenv는 shims를 사용하여 일반적인 루비 명령을 가로챕니다. (Asdf도 shims를 사용합니다.)
Homebrew로 Rbenv를 설치한 후에는 Rbenv shims가 일반 루비 명령보다 우선순위를 가지도록 ~/.zshrc
파일을 수정해야 합니다. shim은 어떤 버전의 루비를 사용할지 결정한 후 모든 루비 명령을 실행하기 전에 rbenv exec
명령을 호출합니다.
시미스는 두 가지 단점이 있습니다. 첫째, 시미스는 실제 명령을 숨기면서 문제 해결을 더 어렵게 만듭니다. 예를 들어, which ruby
명령어는 Rbenv 시미스를 보여주지 실제 Ruby 버전을 보여주지 않습니다(실제 Ruby 명령을 보려면 RBENV_DEBUG
환경 변수를 설정해야 함). 둘째, 시미스는 Ruby 명령의 실행에 마이크로초 단위의 지연을 추가할 수 있습니다. (Rbenv는 디렉토리를 변경할 때만 간섭하는 RVM과 달리 모든 Ruby 명령을 실행할 때마다 간섭함) 이러한 지연을 감지하거나 시미스 개념을 좋아하지 않는 개발자들에게는 Chruby나 Frum이 있습니다.
Chruby
Chruby는 RVM이나 Rbenv만큼 유명하지는 않지만, 여러 명의 주요 Ruby 개발자들에 의해 지지받고 있습니다. RVM과 달리 cd
명령을 재정의하지 않습니다. Rbenv나 Asdf와 달리 시미스를 사용하여 명령을 가로채지 않습니다. Chruby를 로컬 쉘 환경에서 실행하도록 ~/.zshrc
파일을 수정해야 합니다. Chruby는 선택한 Ruby 버전을 기반으로 $PATH
를 수정하므로 별도로 수정할 필요가 없습니다.
Chruby는 Ruby에 대한 특정 환경 변수를 설정합니다. 이것으로 Chruby가 여러 Ruby 버전 간에 전환하는 데 필요한 모든 것이 완료됩니다. which
로 문제 해결을 잘 해낼 수 있습니다. 몇 년간 Chruby를 사용해 본 적이 있으며 문제가 없었습니다. Chruby는 훌륭한 선택지이지만, 가장 최신의 Ruby 버전 관리자인 Frum을 사용해 보고 싶을 수도 있습니다.
Frum
프럼은 Rust로 작성되었으며, 시스템 소프트웨어의 빠른 명령줄 실행에 적합한 언어입니다. 프럼은 최근에 출시되었으며(2021년 초 출시). Asdf, Chruby 또는 Rbenv과 달리, 내장된 Ruby 설치 명령어를 포함하고 있어 Ruby를 설치하기 위해 추가 프로그램이 필요하지 않습니다. 설치 프로그램은 빠르며, 프럼은 종속성이 없습니다(Homebrew로 설치할 수 있는 일체형 Rust 실행 파일).
프럼을 설치한 후에는 로컬 쉘 환경에서 프럼을 실행하도록 ~/.zshrc
파일을 수정해야 합니다. 다른 버전 관리자들과 마찬가지로, 프로젝트 디렉토리에 .ruby-version
파일을 확인하고, 프로젝트에 대한 버전이 지정되어 있지 않으면 전역 Ruby 버전을 기본으로 사용합니다. Asdf나 Rbenv과 달리 쉼표(shims)가 없으며 cd
명령어를 덮어쓰지 않습니다(RVM과 달리). 최근에 출시되었지만, 일체형이며 빠르기 때문에 추천합니다.
Ruby용 버전 관리자 설치
I’ve written a complete guide to installing Ruby on Mac. In the guide, I provide instructions for:
RVM 또는 Rbenv를 살펴보려면:
A Note about Docker
루비 버전 관리자에 대해 언급하면 누군가는 “나는 Docker를 사용한다”고 말할 가능성이 있습니다. Docker는 일부 개발자들이 버전 관리에 사용하는 컨테이너화 도구입니다. Docker의 주요 사용 사례는 어떤 애플리케이션을 실행하는 데 필요한 구성된 버전의 모든 소프트웨어 종속성을 포함하는 재현 가능한 가상 서버를 만드는 것입니다 (언어, 데이터베이스, 메시지 큐). 그런 의미에서 Docker는 서버에 배포하기 위한 개발 환경의 “고정” 버전을 만드는 데 이상적입니다.
컨테이너 내에서 로컬로 개발할 수도 있지만, 버전 관리자에 비해 실행 속도가 느려지고 메모리 사용량이 늘어나며 구성 복잡성이 증가합니다. 간단하게 유지하기 위해 애플리케이션이 너무 복잡한 경우가 아니면 Docker를 로컬 개발에 사용하지 않습니다.
결론
여러분이 여러 루비 프로젝트에서 작업한다면 단순한 루비 사용자가 아닙니다. 로컬 개발 환경에 훌륭한 버전 관리자를 설치하십시오.
I like Asdf because I develop in Ruby and JavaScript and Asdf gives me one version manager for both languages. However, Asdf uses shims (like Rbenv) so occasionally it’s slower than I like. I also find it annoying that Asdf hides the actual command from troubleshooting with the which
command. If these drawbacks outweigh the convenience of managing multiple languages, I recommend using Frum to switch among your Ruby versions. Version managers should be simple and stay out of your way when you’re working.
MacOS용 Ruby Version Managers에 대한 자주 묻는 질문 (FAQs)
RVM과 rbenv의 주요 차이점은 무엇인가요?
RVM (Ruby 버전 관리자)과 rbenv는 시스템에서 여러 버전의 Ruby를 관리하는 도구들입니다. 주요 차이점은 그들의 접근 방식에 있습니다. RVM은 더 많은 기능을 제공하며, 특정 Ruby 애플리케이션에 사용되는 기본 설정 – 일련의 gems을 관리할 수 있습니다. 반면에, rbenv는 단순하며 오직 Ruby 버전을 전환하는 것에 집중합니다. 그것은 gemsets를 지원하지 않지만, ruby-build라는 플러그인을 사용하여 비슷한 기능을 달성할 수 있습니다.
RVM을 사용하여 특정 버전의 Ruby를 어떻게 설치하나요?
RVM을 사용하여 특정 버전의 Ruby를 설치하려면 ‘rvm install’ 명령어 뒤에 버전 번호를 붙여 사용하십시오. 예를 들어, Ruby 2.6.3을 설치하려면 ‘rvm install 2.6.3’ 명령어를 사용하십시오. 설치가 완료되면, ‘rvm use’ 명령어를 사용하여 이 버전으로 전환할 수 있습니다. 예를 들어 ‘rvm use 2.6.3’입니다.
RVM과 rbenv를 동시에 사용할 수 있나요?
기술적으로는 RVM과 rbenv를 동일한 시스템에 설치하는 것이 가능하지만, 일반적으로 권장되지 않습니다. 두 도구 모두 셸 환경을 수정하며, 둘 다 있을 경우 예기치 않은 동작이 발생할 수 있습니다. 요구 사항에 따라 하나를 선택하고 계속 사용하는 것이 가장 좋습니다.
rbenv를 사용하여 Ruby 버전을 어떻게 제거하나요?
rbenv를 사용하여 Ruby 버전을 제거하려면 ‘rbenv uninstall’ 명령어 뒤에 버전 번호를 붙여 사용하십시오. 예를 들어, Ruby 2.6.3을 제거하려면 ‘rbenv uninstall 2.6.3’ 명령어를 사용하십시오.
RVM으로 기본 Ruby 버전을 어떻게 설정하나요?
RVM을 사용하여 기본 Ruby 버전을 설정하려면 ‘rvm –default use’ 명령어를 사용하고 버전 번호를 추가합니다. 예를 들어, Ruby 2.6.3을 기본으로 설정하려면 ‘rvm –default use 2.6.3’ 명령어를 사용하면 됩니다.
rbenv와 그 플러그인을 어떻게 업데이트하나요?
rbenv와 그 플러그인을 업데이트하려면 git을 사용할 수 있습니다. 터미널에서 rbenv 디렉토리로 이동하고(일반적으로 ‘~/.rbenv’) ‘git pull’을 실행한 다음, 각 플러그인 디렉토리로 이동하여 동일한 작업을 수행하세요.
RVM이나 rbenv을 다른 프로그래밍 언어와 함께 사용할 수 있나요?
RVM과 rbenv은 특히 Ruby 버전 관리를 위해 설계되었습니다. 다른 프로그래밍 언어의 버전을 관리해야 한다면 Python의 pyenv나 Node.js의 nvm과 같은 도구를 살펴보시기 바랍니다.
rbenv로 설치된 모든 Ruby 버전을 어떻게 나열하나요?
rbenv로 설치된 모든 Ruby 버전을 나열하려면 ‘rbenv versions’ 명령어를 사용하면 됩니다. 이 명령어는 rbenv가 사용할 수 있는 모든 Ruby 버전의 목록을 표시합니다.
RVM으로 gem 의존성을 어떻게 관리하나요?
RVM은 gemset을 사용하여 gem 의존성을 관리할 수 있습니다. ‘rvm gemset create’ 명령어로 gemset을 생성하고, ‘rvm gemset use’ 명령어로 해당 gemset으로 전환한 후, 필요한 경우 각 gem을 설치하면 됩니다.
rbenv로 새로운 Ruby 버전을 어떻게 설치하나요?
rbenv로 새로운 Ruby 버전을 설치하려면 ‘rbenv install’ 명령어를 사용하고 버전 번호를 추가하면 됩니다. 예를 들어, Ruby 2.6.3을 설치하려면 ‘rbenv install 2.6.3’ 명령어를 사용하면 됩니다.
Source:
https://www.sitepoint.com/ruby-version-managers-macos/